【发布时间】:2016-07-02 08:51:04
【问题描述】:
假设我想创建一个内省节,它显示一个函数的可用细节。
类似于下面代码的底部:
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 name in ['__name__', '__doc__', ...]: .... -
@MosesKoledoye 在后台,这正是
sample对象是什么! -
@jonrsharpe 对!因此,将属性作为列表中的名称,就像您所做的那样,使用
getattr -
有疑问,就做
print('__name__', f.__name__)?另外,查看inspect模块。
标签: python python-3.x attributes eval introspection