繁体   English   中英

如何打印Python属性名称?

[英]How to print a Python attribute name?

假设我想创建一个自省节,以显示函数的可用详细信息。
类似于以下代码的底部:

def sample(_range=4):
    """ produce a range of integers """
    for i in range(_range):
        yield i

f = sample
for i in (f.__name__, f.__doc__, f.__dict__, f.__code__, f.__defaults__, f.__globals__, f.__closure__):
    print("XXX", i)

我无法实现的是将XXX更改为可以打印属性名称的内容,例如,代替

XXX sample
XXX  produce a range of integers
XXX {}
XXX <code object sample at 0xfff15890, file "/tmp/tmp.py", line 1>
XXX (4,)
XXX {'__loader__': <_frozen_importlib.SourceFileLoader object at 0xfff13b30>, '__package__': None, '__file__': '/tmp/tmp.py', '__cached__': None, 'i': {...}, 'f': <function sample at 0xfff5b1e0>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, '__spec__': None, '__name__': '__main__', 'sample': <function sample at 0xfff5b1e0>}
XXX None

我想要

__name__ sample
__doc__  produce a range of integers
__dict__ {}
__code__ <code object sample at 0xfff15890, file "/tmp/tmp.py", line 1>
__defaults__ (4,)
f.__globals__ {'__loader__': <_frozen_importlib.SourceFileLoader object at 0xfff13b30>, '__package__': None, '__file__': '/tmp/tmp.py', '__cached__': None, 'i': {...}, 'f': <function sample at 0xfff5b1e0>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, '__spec__': None, '__name__': '__main__', 'sample': <function sample at 0xfff5b1e0>}
__closure__ None

您建议替换XXX什么?

如您的示例所示,如果您知道所需属性的名称,则可以这样做:

for fn in ('__name__', '__doc__', '__dict__', '__code__', '__defaults__', '__globals__', '__closure__'):
    print(fn, getattr(f, fn))

如果您要问的是函数时该如何命名,那么我相信您很不幸。 名称不是函数的属性,而是函数的引用方式,就像您不能问包含数字3的变量的名称仅来自数字一样。 (思想练习:作为3个不同对象(每个都有不同名称)的一部分的函数的名称是什么?)

我想,如果您想要特定对象中函数的名称,则可以遍历该对象的属性,以搜索您的函数; 当您找到它时,用来引用它的名称就是您想要的名称。

由于已经有了属性列表,因此可以使用getattr

for name in ['__name__', '__doc__', '__dict__', '__code__', '__defaults__', '__globals__', '__closure__']:
    print('{} -> {}'.format(name, getattr(f, name)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM