2012-11-28 77 views
1

我正在調用一個函數(read_param),該函數依賴於來自主腳本(master.py)的文件(libfun.py)中定義的're'模塊。當我這樣做,我得到一個NameError:全局名稱未定義,雖然模塊已導入

NameError: global name 're' is not defined 

我導入「重」模塊中的主腳本,但似乎在模塊中我輸入的功能不能使用它。我不想從函數內部導入're',因爲這看起來很浪費。這是爲什麼發生?

(這是一個最小的例子,不是我的實際代碼):

libfun.py:

def read_param(paramname, paramfile): 
    # code here depends on re module, e.g. calling re.split() 

master.py:

#!/usr/bin/env python2 

import re 
import libfun as lf 

lf.read_param('parameter', 'filename') 
+6

不應該在實際使用它的模塊中導入're'? –

+0

請顯示完整的回溯和導致錯誤的代碼。你不會顯示任何依賴變量're'的代碼。 – Marcin

+0

「我不想從函數內部導入're',因爲這看起來很浪費。」 - 你沒有理由讓自己生活困難http://stackoverflow.com/questions/296036/does-python-optimize-modules-when-they-are-imported-multiple-times – YXD

回答

4

您正在尋找在問題上倒退。模塊應該是獨立的,因此他們需要管理他們自己的所有依賴關係。

想象一下,如果你有15個不同的腳本,所有腳本都使用readparam()。強制使用每個腳本到import re是沒有意義的,只是使用readparam()。你最終會導入它十五次,並且你需要閱讀文檔或源文件,甚至知道你必須導入它。

正確的方法是在libfun.py的頂部import re。除非您在master.py本身內使用re,否則不需要將其導入master.py

+1

另外,值得注意的是, Python中的「全局變量」並不是真正的全局變量,它們被限制在它們被定義的模塊中。因此,在'master.py'中導入're'可以在'master.py'中使用're',但在*'libfun.py'中''re''完全不能*。 – kindall