2014-08-31 111 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... 

複雜性必須不同。細節應該檢查源代碼,我想。所以,我更喜歡第二種方式。

相關問題