2013-03-11 17 views
0

我試圖創建一個__init__.py文件,該文件將* .py文件中的所有函數從目錄導入命名空間(目錄名稱)。邏輯如下:Python將目錄中的文件的所有功能導入到一個命名空間

for f in os.listdir(wd): 
    if not f.endswith('.py') or f == '__init__.py': 
     continue 
    names = get_public_functions(open(wd + f)) 
    try: 
     mod = __import__(f[:-3], fromlist=names) 
     for fn in names: 
      fun = getattr(mod, fn) 
      setattr(sys.modules[__name__], fn, fun) 
    except Exception as e: 
     for fn in names: 
      setattr(sys.modules[__name__], fn, lambda: str(e)) 

所以,你可以看到,如果有語法錯誤,在一個文件中,該功能將仍然需要進口,但他們將返回語法錯誤(作爲一個字符串)。

什麼是令人沮喪的是,當有多個文件的語法錯誤,而我希望是這樣的:

mymodule.fn() => error1, 
mymodule.fn2() => error1 (these were from the first file), 
mymodule.fn3() => error2 etc. 

我只得到了最後一條錯誤消息。我認爲錯誤必須在except區塊中,但我無法確定。誰能幫忙?

+0

可能重複(http://stackoverflow.com/questions/12423614/local-variables-in -python-nested-functions) – 2013-03-11 15:34:27

回答

1

您需要將e的值綁定到您創建的lambda範圍。或者說,你要的str(e)結果綁定到拉姆達:

error = str(e) 
for fn in names: 
    setattr(sys.modules[__name__], fn, lambda error=error: error 

現在每個拉姆達有一個關鍵字參數存儲error當時的電流值。因爲error參數是一個具有默認值的關鍵字參數,所以在使用參數調用時,lambda表達式仍然可以工作。

另一種方法是創建一個新的功能範圍:[在Python嵌套函數局部變量]的

def errorfunction(error): 
    return lambda: error 

error = str(e) 
for fn in names: 
    setattr(sys.modules[__name__], fn, errorfunction(error) 
+0

是否有可能使函數沒有參數? – kaspersky 2013-03-11 15:27:35

+0

@ gg.kaspersky:不是沒有創建另一個嵌套範圍。你的函數可以在沒有參數的情況下被調用(它有一個默認值)。 – 2013-03-11 15:28:07

+0

是的,默認參數解決它。那麼,錯誤是因爲什麼?我記得閱讀關於此的一些信息...... – kaspersky 2013-03-11 15:31:07

相關問題