2014-08-31 110 views
0

如果我要向本地模块动态添加属性(在该模块中添加属性),首选以下两种方法中的哪一种?我想让它在Python 2和3以及未来的3.x上都能正常工作。动态地将属性添加到Python中的本地模块

1.

# cat ./test1.py 
import sys 

def set_attr(name, value): 
    this = sys.modules[__name__] 
    setattr(this, name, value) 

if __name__ == "__main__": 
    set_attr("get_doubled", lambda x: x * 2) 
    set_attr("get_tripled", lambda x: x * 3) 
    print(get_doubled(1)) 
    print(get_tripled(1)) 
# python ./test1.py 
2 
3 

2.

# cat ./test2.py 
def set_attr(name, value): 
    globals()[name] = value 

if __name__ == "__main__": 
    set_attr("get_doubled", lambda x: x * 2) 
    set_attr("get_tripled", lambda x: x * 3) 
    print(get_doubled(1)) 
    print(get_tripled(1)) 
# python ./test2.py 
2 
3 
+2

我认为它们是等效的。我想不出他们会有所不同的情景。话虽如此,我更喜欢第一个。它感觉更干净。 – rubik 2014-08-31 14:27:26

回答

0

可能有一些差别不大。选中此项:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import sys 

def set_attr(name, value): 
    this = sys.modules[__name__] 
    setattr(this, name, value) 

def set_attr1(name, value): 
    globals()[name] = value 

def test(): 
    set_attr("get_doubled", lambda x: x * 2) 
    set_attr("get_tripled", lambda x: x * 3) 

def test1(): 
    set_attr1("get_doubled", lambda x: x * 2) 
    set_attr1("get_tripled", lambda x: x * 3) 

if __name__ == "__main__": 
    import timeit 

    print timeit.timeit("test()", "from __main__ import test") # 2.304... 
    print timeit.timeit("test1()", "from __main__ import test1") # 1.201... 

复杂性必须不同。细节应该检查源代码,我想。所以,我更喜欢第二种方式。

相关问题