func 是 Python 中约定俗成的函数对象占位符名称,非关键字或类型,常用于装饰器、高阶函数、回调等场景,需配合 Callable 类型注解而非误作类型使用。

func 在 Python 中不是关键字或内置类型,而是开发者广泛使用的变量名、参数名或占位符,用来表示“某个函数对象”——它本身没有特殊含义,但约定俗成地暗示“这里要传一个可调用的东西”。
func 作为函数参数名(如装饰器、高阶函数)
这是 func 最典型的使用场景:在定义接受函数作为输入的函数时,用 func 作形参名,清晰表达意图。
- 装饰器内部必须接收被装饰的函数,
func是最直白的命名选择 - 不推荐用
f或fn(缩写易歧义),也不建议用function(太长且和内置function类型冲突) - 如果函数需同时处理多个函数,可用
func+ 后缀,如pre_func、post_func
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Before call")
result = func(*args, **kwargs)
print("After call")
return result
return wrapper
@my_decorator
def say_hello():
print("Hello!")
func 与 callable 类型检查
当逻辑需要判断某个对象是否可调用时,常配合 func 变量名使用 callable() 或 isinstance(obj, types.FunctionType),但要注意:
-
callable(func)返回True的不只是函数,还包括类实例(实现了__call__)、lambda、方法等 -
isinstance(func, types.FunctionType)才严格限定为普通函数(不含 lambda、方法、functools.partial) - 实际业务中,通常只需
callable(func)就够了,过度限制反而降低灵活性
func 在回调(callback)和事件处理中的惯用法
异步库(如 asyncio)、GUI 框架(如 tkinter)或 HTTP 客户端(如 requests 的 hooks)中,func 常作为回调参数名出现:
-
requests.get(url, hooks={'response': func})—— 这里的func必须接收response和*args两个参数 -
tkinter.Button(root, command=func)——func不能带参数(除非用lambda或functools.partial包装) - 传入前务必确认目标 API 对
func的签名要求,否则运行时报TypeError: func() takes 0 positional arguments but 1 was given
func 不是 type,别误当成类型注解
有人会写 def run(func: func),这是错误的——func 不是 Python 的类型。正确做法是:
- 用
Callable:from typing import Callable,然后写func: Callable[[int, str], bool] - 若只关心“可调用”,用
Callable[..., Any] - 不要试图用
func做类型别名(如Func = func),这不会被类型检查器识别
真正容易被忽略的是:哪怕你把参数命名为 func,Python 运行时也完全不校验它是不是函数;所有约束都靠文档、类型提示和测试来保障。











