簡體   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