传递函数时,我通常使用typing.Callable
.
文档collections.abc.Callable
声明它有四种 dunder 方法:
类 collections.abc.Callable
分别提供方法的类的ABCs contains ()、hash ()、len ()和call ()。
有一次,我想检查函数是否有__wrapped__
属性。这在运行时通过检查可以正常工作hasattr(func, "__wrapped__")
。
当使用 进行静态类型检查时mypy
,它会报告:error: "Callable[..., Any]" has no attribute "__wrapped__" [attr-defined]
. 这对我来说很有意义,因为Callable
不应该有一个__wrapped__
属性。
如何正确键入Callable
带有__wrapped__
属性的提示 a?我可以做一些其他类型的提示或解决方法吗?
代码示例
我正在使用mypy==0.782
和Python==3.8.2
:
from functools import wraps
from typing import Callable
def print_int_arg(arg: int) -> None:
"""Print the integer argument."""
print(arg)
@wraps(print_int_arg)
def wrap_print_int_arg(arg: int) -> None:
print_int_arg(arg)
# do other stuff
def print_is_wrapped(func: Callable) -> None:
"""Print if a function is wrapped."""
if hasattr(func, "__wrapped__"):
# error: "Callable[..., Any]" has no attribute "__wrapped__" [attr-defined]
print(f"func named {func.__name__} wraps {func.__wrapped__.__name__}.")
print_is_wrapped(wrap_print_int_arg)