2012-11-05 55 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遍历字典的键或使用其他词典方法。