我有一个装饰器,用于记录装饰函数的名称(除其他外)。

访问装饰函数的 __name__ 属性是否安全?或者是否有一些我还没有遇到过的没有名称的可调用类型?

最佳答案

用其他答案和评论的摘要来回答我自己的问题。

并非所有可调用对象都有 __name__

  • 定义 __call__ 的类的实例可能没有 __name__ 属性。
  • functools.partial 创建的对象没有 __name__ 属性。

  • 解决方法是使用三个参数 getattr :
    name = getattr(callable, '__name__', 'Unknown')
    

    或者使用 repr(callable) 而不是 'Unknown' ,这将包含有关可调用的更多信息:
    name = getattr(callable, '__name__', repr(callable))
    

    关于python - 是否所有可调用对象都有 __name__?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33576932/

    10-12 18:53