2010-06-02 55 views
3

我在一個Python文件中編寫了一個小的內部DSL文件,這個文件已經增長到了我想要將內容分割到多個不同的目錄+文件中的一個點。將python包中的符號導入到調用者的命名空間中

新目錄結構目前看起來像這樣:

dsl/ 
    __init__.py 
    types/ 
     __init__.py 
     type1.py 
     type2.py 

和每種類型的文件包含一個類(例如Type1)。

我的問題是,我想保留的代碼,使用這個DSL的實現儘可能的簡單,這樣的:

import dsl 
x = Type1() 
... 

這意味着所有的重要標誌應在可直接用戶的名字空間。我曾嘗試更新頂級__init__.py文件導入相關的符號:

from types.type1 import Type1 
from types.type2 import Type2 
... 
print globals() 

輸出顯示的符號正確導入,但他們仍然沒有出現在調用者的代碼(這是做的代碼import dsl)。我認爲問題在於符號實際上是被導入到'dsl'命名空間。我怎樣才能改變這個,以便這些類也可以在調用者的名字空間中直接使用?

回答

2

你不得不說

from dsl import * 
+0

其實這些符號是從dsl下一級。例如dsl.types.type1。 – 2010-06-02 18:54:00

+1

@WaiYipTung:Paul C說他已經更新了頂層'__init__。py'包含這些符號,所以做一個'from dsl import *'應該仍然可以工作,即使這些符號最初被定義爲低一級。 – 2010-06-02 19:43:01

0

你不能做到這一點。這取決於用戶將他們導入到自己的代碼中。如果他們想將所有東西都導入到他們的名字空間中,他們可以做from dsl import *,但是你不能指定它。

1

這是我會做什麼

在DSL /初始化__。PY,加上

def import_symbols(namespace): 
    namespace['type1'] = dsl.types.type1 
    namespace['type2'] = dsl.types.type2 

從來電者,做

import dsl 

dsl.import_symbols(globals()) 

沒有隻能從第二個符號輸入通過定義您自己的import_symbols(),您還可以更明確地控制要導入哪個符號,而不是用導入everythin。

0

@Eli,@Daniel感謝「aha」的回答。我幾乎在那裏,但需要額外的推動......

基本上解決方案分爲兩個階段:使用包初始化程序將'導出的'二級符號拉入頂層dsl包(此位我已經有了),然後將這些符號與from dsl import *一起放入呼叫者的代碼中。這很有意義,因爲調用者應該真正控制他們進入他們的名字空間的內容。

from pkg import *似乎一般不贊成,但在這種情況下,我認爲這是一個合理的解決方案,因爲我的軟件包導出的符號數量將受到限制。

+1

你是如何做到這一點的?將第二級符號拉入頂層'dsl'包中? – noio 2011-01-07 10:41:44

相關問題