所有的callables都有__name__吗?

时间:2015-11-06 22:49:58

标签: python

我有一个装饰器,记录装饰功能的名称(以及其他内容)。

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

2 个答案:

答案 0 :(得分:7)

功能非常安全:

def d():
    pass

l = lambda: None
print(d.__name__)
print(l.__name__)

输出:

> d 
> <lambda>

您甚至可以安全地修改它(例如用于debuging):

l.__name__ = 'Empty function'
print(l.__name__)  # Empty function

但要注意使用__call__方法的课程,他们没有__name__属性。

class C(object):
    def __call__(self):
        print('call')

print(C().__name__)  # AttributeError: 'C' object has no attribute '__name__'

更新

正如@felipsmartins在评论中指出的那样,functools.partial也没有__name__属性。

相关:

What is a "callable" in Python?

答案 1 :(得分:7)

回答我自己的问题,并附上其他答案和评论的摘要。

并非所有的callables都有__name__

  • 定义__call__的类的实例可能没有__name__属性。

  • 使用functools.partial创建的对象没有__name__属性。

解决方法是使用三个参数getattr

name = getattr(callable, '__name__', 'Unknown')

或使用repr(callable)代替'Unknown',其中包含有关可调用的更多信息:

name = getattr(callable, '__name__', repr(callable))