说我想创建一个内省节,它显示一个函数的可用细节。
类似于以下代码的底部:
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
?
答案 0 :(得分:2)
如果在您的示例中,您知道所需属性的名称,那么这将起作用:
split(euc.dist(df$x1, df$x2), list(df$Date, df$Item), T)
# $`2-Jan.Cat`
# [1] 0.1
#
# $`1-Jan.Dog`
# [1] 0.1 0.2
#
# $`2-Jan.Dog`
# [1] 0.2
如果你问的是如何获得这个名字,那么你所拥有的就是这个功能,那么我相信你运气不好;名称不是函数的属性,而是它的引用方式,就像你不能问这个包含数字3的变量的名字只是来自数字。 (思考练习:作为3个不同对象的一部分的函数的名称是什么,每个对象的名称不同?)
我想,如果你想要特定对象中函数的名称,你可以迭代该对象的属性,搜索你的函数;当你找到它时,你用来引用它的名字就是你想要的名字。
答案 1 :(得分:1)
由于您已拥有属性列表,因此可以使用getattr
:
for name in ['__name__', '__doc__', '__dict__', '__code__', '__defaults__', '__globals__', '__closure__']:
print('{} -> {}'.format(name, getattr(f, name)))