我有一个装饰器,记录装饰功能的名称(以及其他内容)。
访问已修饰函数的__name__
属性是否安全?或者是否有一些可调用的类型没有我尚未遇到的名称?
答案 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__
属性。
相关:
答案 1 :(得分:7)
回答我自己的问题,并附上其他答案和评论的摘要。
并非所有的callables都有__name__
。
定义__call__
的类的实例可能没有__name__
属性。
使用functools.partial
创建的对象没有__name__
属性。
解决方法是使用三个参数getattr
:
name = getattr(callable, '__name__', 'Unknown')
或使用repr(callable)
代替'Unknown'
,其中包含有关可调用的更多信息:
name = getattr(callable, '__name__', repr(callable))