2012-11-05 76 views
2

出於純粹的好奇心:有沒有一種簡單的方法(不超過兩行代碼)來訪問函數的指定屬性的字典/列表在那個函數中)?python的函數屬性:獲取所有分配屬性的列表/字典

例如爲:

def func(*args): 
    print("# of arguments = {0} ".format(len(args)))  # normal arguments 
    print("# of attributes = {0}".format(len(func_attrs))) # function-attributes 

func() 

func.func_attr_1 = 'How do i get all attributes from within the associated function?' 
func.func_attr_2 = 'How do i get all attributes from within the associated function?' 

由於功能是可調用的對象有可能爲他們提供屬性,但 似乎有不蜜蜂的方式來訪問一個簡單的方法,這些屬性的列表。

locals()globals()沒有幫助。 dir()似乎要做的伎倆,但你必須過濾你的屬性。如果您事先不知道屬性名稱,這有點不方便。

如果我可以指定一個屬性那裏必須..應該是一種方式來訪問其內部的目錄。

UPDATE

我完全以忘了實際調用/調用=實例函數試圖訪問該屬性之前。 ... 我的錯! - sry和thx的答案;-)

自然我試過func.__dict__dir(func),但只是沒有實例化函數對象之前這樣做......並在我原來的測試我最初定義的屬性從內函數,然後沒有調用該函數,但試圖從外部範圍訪問函數屬性 - 這自然失敗了!

+1

我認爲這值得問爲什麼你需要這個。 100箇中的99個,保持外部狀態(通過屬性)的函數根本不應該是函數。在那一點上,你可能應該使用一個類... – mgilson

+0

正如我在開頭所述:出於純粹的好奇心! –

回答

5

而不是使用func.__dict__的,我認爲它看起來更好使用vars()

>>> def func(): 
...  pass 
... 
>>> func.a = 19 
>>> 
>>> func.__dict__ 
{'a': 19} 
>>> vars(func) 
{'a': 19} 
>>> vars(func) is func.__dict__ 
True 

更少的下劃線。

+0

我喜歡更多的下劃線! ;-) –

5

你意味着這樣的事情,使用__dict__

In [11]: def foo(): 
    ....:  foo=1 

In [12]: foo.bar=3 

In [13]: foo.__dict__ 
Out[13]: {'bar': 3} 
4

鑑於函數名funcfunc.__dict__是函數的字典,它包含直接在功能分配的所有屬性。然後,您可以執行成員資格測試(if foo in func.__dict__),使用for遍歷字典的鍵或使用其他詞典方法。