10

我正在为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 的静态分析告诉我,我不能期望 aCallable具有属性__module__。到目前为止,我还没有遇到过失败的情况。有谁知道在什么情况下可能会遇到Callable没有该__module__属性的 a ?

4

1 回答 1

3

这是一个例子:

list.__add__

那是一个没有的可调用对象__module__。这是列表连接的未绑定方法。

一般来说,callables 没有一个__module__. 只需要可以调用它们即可。也没有要求可调用对象具有__name__,并且对于大多数可调用类型,与它们一起使用是没有意义的functools.wraps

你的装饰器需要一个普通 Python 函数类型的实例;它不能接受任意可调用对象。如果你要给它类型提示,你应该用那种类型来提示它:

def function_logging(fn: types.FunctionType) -> types.FunctionType:
    ...
于 2020-05-06T10:19:50.987 回答