Callable何时缺少__module __?

问题描述 投票:8回答:1

我正在为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__。到目前为止,我还没有遇到失败的情况。没有人知道在什么情况下可能会遇到没有Callable属性的__module__吗?

python pycharm typing structural-typing
1个回答
0
投票

这里是一个例子:

list.__add__

这是没有__module__的可呼叫电话。这是列表连接的未绑定方法。

通常,不要求可调用项具有__module__。只是必须可以调用它们。也没有要求可调用对象必须具有__name__,对于大多数可调用类型,将functools.wraps与它们一起使用没有任何意义。

您的装饰器需要一个普通Python函数类型的实例;它不能接受任意可调用对象。如果要为其提供类型提示,则应使用该类型进行提示:

def function_logging(fn: types.FunctionType) -> types.FunctionType:
    ...
© www.soinside.com 2019 - 2024. All rights reserved.