Callable什么时候缺__module__?
When does Callable lack __module__?
我正在为 python 中的函数制作一个日志装饰器:
import logging
from typing import Callable
from functools import wraps
def function_logging(fn: Callable) -> Callable:
fn_logger = logging.getLogger(fn.__module__ + '.' + fn.__name__)
@wraps(fn)
def wrapper(*args, **kwargs):
fn_logger.info("Args: {}".format(args))
fn_logger.info("Kwargs: {}".format(kwargs))
result = fn(*args, **kwargs)
fn_logger.info("Return: {}".format(result))
return result
return wrapper
PyCharm 的静态分析告诉我,我不能期望 Callable
具有属性 __module__
。到目前为止,我还没有遇到这种失败的情况。有谁知道在什么情况下可能会遇到没有 __module__
属性的 Callable
?
这是一个例子:
list.__add__
这是一个没有 __module__
的可调用函数。这是列表连接的未绑定方法。
一般来说,可调用对象没有 __module__
的要求。只需要可以打电话给他们。也没有要求可调用对象具有 __name__
,并且对于大多数可调用类型,将 functools.wraps
与它们一起使用是没有意义的。
您的装饰器需要普通 Python 函数类型的实例;它不能接受任意的可调用对象。如果你要给它类型提示,你应该用那个类型来提示它:
def function_logging(fn: types.FunctionType) -> types.FunctionType:
...
我正在为 python 中的函数制作一个日志装饰器:
import logging
from typing import Callable
from functools import wraps
def function_logging(fn: Callable) -> Callable:
fn_logger = logging.getLogger(fn.__module__ + '.' + fn.__name__)
@wraps(fn)
def wrapper(*args, **kwargs):
fn_logger.info("Args: {}".format(args))
fn_logger.info("Kwargs: {}".format(kwargs))
result = fn(*args, **kwargs)
fn_logger.info("Return: {}".format(result))
return result
return wrapper
PyCharm 的静态分析告诉我,我不能期望 Callable
具有属性 __module__
。到目前为止,我还没有遇到这种失败的情况。有谁知道在什么情况下可能会遇到没有 __module__
属性的 Callable
?
这是一个例子:
list.__add__
这是一个没有 __module__
的可调用函数。这是列表连接的未绑定方法。
一般来说,可调用对象没有 __module__
的要求。只需要可以打电话给他们。也没有要求可调用对象具有 __name__
,并且对于大多数可调用类型,将 functools.wraps
与它们一起使用是没有意义的。
您的装饰器需要普通 Python 函数类型的实例;它不能接受任意的可调用对象。如果你要给它类型提示,你应该用那个类型来提示它:
def function_logging(fn: types.FunctionType) -> types.FunctionType:
...