如何打印Python属性名?

如何打印Python属性名?,python,python-3.x,attributes,eval,introspection,Python,Python 3.x,Attributes,Eval,Introspection,假设我想创建一个内省节,它显示函数的可用细节类似于以下代码的底部: 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.__closur

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

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
XXX样本
XXX产生一系列整数
XXX{}
XXX<在0xfff15890处编码对象样本,文件“/tmp/tmp.py”,第1行>
XXX(4,)
XXX{“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
XXX无
我想要一个

__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
\uuuuu name\uuuuuu样本
__doc_uu_u生成一系列整数
__dict_u{}
__代码uuu<0xfff15890处的代码对象示例,文件“/tmp/tmp.py”,第1行>
__默认值(4,)
f、 “全局加载程序:”无“,”无“,”无“,”无文件“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”无“,”名“,”无“,”样本“,”
__闭包无

如果您知道所需属性的名称(如示例中所示),您会建议用什么替换
XXX

for fn in ('__name__', '__doc__', '__dict__', '__code__', '__defaults__', '__globals__', '__closure__'):
    print(fn, getattr(f, fn))
如果你只是问如何得到这个名字,而你所拥有的只是这个函数,那么我相信你是运气不好;名称不是函数的属性,而是它是如何被引用的,就像你不能问包含数字3的变量的名称是什么一样。(思考练习:作为3个不同对象的一部分的函数的名称是什么,每个对象的名称不同?)


我想,如果你想要一个特定对象中的函数名,你可以迭代该对象的属性,搜索你的函数;当您找到它时,您用来引用它的名称将是您想要的名称。

如果您知道所需属性的名称,如您的示例所示,这将起作用:

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)))

因为您已经有了一个属性列表,所以可以使用
getattr

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

你可以用字典吗?名称作为键,值作为属性为什么不迭代名称呢
对于['''''''''.'文档'.''.'中的名称,…]:…
@MosesKoledoye在引擎盖下,这正是
示例
对象的内容@乔尔沙普:对!因此,对于列表中作为名称的属性,就像您所做的那样,使用
getattr
就足够了,只需执行
打印(“'''u name''u',f.'u name'
?另外,看看模块。你可以用字典吗?名称作为键,值作为属性为什么不迭代名称呢
对于['''''''''.'文档'.''.'中的名称,…]:…
@MosesKoledoye在引擎盖下,这正是
示例
对象的内容@乔尔沙普:对!因此,对于列表中作为名称的属性,就像您所做的那样,使用
getattr
就足够了,只需执行
打印(“'''u name''u',f.'u name'
?另外,看看这个模块。它应该是
getattr(f,fn)
def foo():pass
实际上为函数对象提供了名称
foo
。所以函数可以也确实有一个名称;它只是一个无法获取名称的变量。它应该是
getattr(f,fn)
def foo():pass
实际上为函数对象提供了名称
foo
。所以函数可以也确实有一个名称;它只是一个你无法得到的变量名。