func 是 Python 中约定俗成的函数对象占位符名称,非关键字或类型,常用于装饰器、高阶函数、回调等场景,需配合 Callable 类型注解而非误作类型使用。
func 在 Python 中不是关键字或内置类型,而是开发者广泛使用的变量名、参数名或占位符,用来表示“某个函数对象”——它本身没有特殊含义,但约定俗成地暗示“这里要传一个可调用的东西”。
这是 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() 或 isinstance(obj, types.FunctionType),但要注意:
callable(func) 返回 True 的不只是函数,还包括类实例(实现了 __call__)、lambda、方法等isinstance(func, types.FunctionType) 才严格限定为普通函数(不含 lambda、方法、functools.partial)callable(func) 就够了,过度限制反而降低灵活性异步库(如 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 包装)func 的签名要求,否则运行时报 TypeError: func() takes 0 positional arguments but 1 was given
有人会写 def run(func: func),这是错误的——func 不是 Python 的类型。正确做法是:
Callable: from typing import Callable,然后写 func: Callable[[int, str], bool]
Callable[..., Any]
func 做类型别名(如 Func = func),这不会被类型检查器识别真正容易被忽略的是:哪怕你把参数命名为 func,Python 运行时也完全不校验它是不是函数;所有约束都靠文档、类型提示和测试来保障。