2015-11-29 33 views
0

我想從導入模塊中的類向當前命名空間分配方法(更多一次),我想在「當前」命名空間中執行「分配進程」,但不是來自進口模塊。我怎樣才能做到這一點?將導入模塊中類的方法分配給當前命名空間

該文件是從另一個輸入:

# File mylib.py 

class MyLib(): 
    def hello1(self, text): 
     print('hello1: %s' % text) 

    def goodbye1(self, text): 
     print('goodbye1: %s' % text) 

    def hello2(self, text): 
     print('hello2: %s' % text) 

    def goodbye2(self, text): 
     print('goodbye2: %s' % text) 

    def assign1(self): 
     pass 
     # This should assign self.hello1() and self.goodbye1() 
     # to "parent" namespace as hello() and goodbye() 

    def assign2(self): 
     pass 
     # Similar behaviour to self.assign1() 

這個文件是「主」之一。

# File myscript.py 

import mylib 

l = mylib.MyLib() 
l.assign1() 

# After this I would like to have MyLib.hello1() assigned to hello() 
# and MyLib.goodbye1() to goodbye() 

hello('hi') 
goodbye('see you') 

l.assign2() 
# After this I would like to have MyLib.hello2() assigned to hello() 
# and MyLib.goodbye2() to goodbye() 

hello('hi') 
goodbye('see you') 

到目前爲止,我試過globals()沒有成功,結果發現__builtins__可能會奏效,但似乎不是因爲污染__builtins__命名空間不屬於那裏內容的正確方法。

我不想要什麼:

# In the "current" namespace 
hello = l.hello1 
goodbye = l.goodbye1 

# Instead I want 

l.assign1() 
# Now hello() and goodbye() are mapped to l.hello1() and l.goodbye1() 
# "automatically" - the assign process was done in l.assign1(), 
# not here in the "current" namespace. 

感謝您的幫助。

回答

1

assign1採取命名空間要分配

def assign1(self, namespace): 
     namespace['hello'] = self.hello1 
     namespace['goodbye'] = self.goodbye1 

現在呼叫者會

import mylib 
l = mylib.MyLib() 
l.assign1(globals()) 
+0

感謝大家誰張貼解答。這個解決了我的問題。我修改了一下 - 我將globals()傳遞給MyLib .__ init __(),所以我不必將它傳遞給assign1()或assign2() – dwich

0

您可以將變量放入模塊的全局名稱空間globals()。這是否足夠......?

文件:submodule.py

class Bar(object): 
    def __init__(self, baz="Hi!"): 
     self.baz = baz 

    def foo(self): 
     print("foo %s" % self.baz) 

    def assign(self): 
     globals()["foo"] = self.foo 

主要腳本:

import submodule 

bar = submodule.Bar() 
bar2 = submodule.Bar("Bye!") 

bar.assign() 
submodule.foo() 

bar2.assign() 
submodule.foo() 

輸出:

foo Hi! 
foo Bye! 
0

我認爲這將是更好的讓你不調整你的代碼必須這樣做,也許這樣:

# File mylib.py 

class MyLib(): 
    #... 

    def assign1(self): 
     return hello1, goodbye1 

    #likewise for assign2 

而且主腳本...

# File myscript.py 

import mylib 

l = mylib.MyLib() 
hello, goodbye = l.assign1() 

如果你真的改變什麼是父命名空間,那麼也許有辦法做到這一點如下:

# File mylib.py 

class MyLib(): 
    def __init__(self, funcs): #funcs should be a list 
     self.funcs = funcs 

    #... 

    def assign1(self): 
     # This should assign self.hello1() and self.goodbye1() 
     # to "parent" namespace as hello() and goodbye() 

     self.funcs[0].__code__ = self.hello1.__code__ 
     self.funcs[1].__code__ = self.goodbye1.__code__ 

    #likewise for assign2 

而且主腳本...

# File myscript.py 

import mylib 

hello = lambda s:s 
goodbye = lambda s:s 

l = mylib.MyLib([hello, goodbye]) 
l.assign1() 

但是,我想說,這讓我覺得......「髒」。就像,這不是很乾淨或Pythonic。對於未來/更大的項目,請使用第一種方法。