2011-05-15 40 views
7

我有2個文件main.py和irc.py.
main.pyPython:如何在模塊中使用主文件中的變量?

import irc 
var = 1 
func() 

irc.py

def func(): 
    print var 

當我嘗試運行main.py我得到這個錯誤

NameError: global name 'var' is not defined

如何使它工作?

@Edit
我想有一個更好的解決方案,但不幸的是,唯一一個我發現是使另一個文件,並將其導入到這兩個文件
main.py

import irc 
import another 
another.var = 1 
irc.func() 

irc.py

import another 
def func(): 
    print another.var 

another.py

var = 0 

回答

10

不要。通過它。儘量保持代碼儘可能分離:一個模塊不應該依賴另一個模塊的內部工作。相反,嘗試儘可能少地暴露。通過這種方式,您可以保護自己不必在每次想讓事情變得有點不同時改變世界。

main.py

import irc 
var = 1 
func(var) 

irc.py

def func(var): 
    print var 
+0

將此函數移動到主文件而不是添加此參數會更容易 – gr56 2011-05-15 21:56:54

+0

@ gr56:然後它聽起來像重構是按順序。如果這也不可能,我會選擇第三個模塊的解決方案,該模塊只包含'var'對象並由兩者導入。如果這對您有用,請將其作爲您自己問題的答案發布並接受。 – 2011-05-16 17:06:10

+0

@SamirTalwar你可以爲函數做到這一點,對於類的實例化呢?例如,您想要在另一個可以導入的模塊中定義類的實例。在這種情況下,參數不能是佔位符。 – 2017-07-12 15:37:19

0

好,無功在函數未聲明。你可以把它作爲一個參數。 main.py

import irc 
var = 1 
func(var) 

irc.py

def func(str): 
    print str 
1

兩個選項。

from main import var 

def func(): 
    print var 

這將複製對原始名稱的引用到導入模塊。

import main 

def func(): 
    print main.var 

這將讓您使用來自其他模塊的變量,並允許您根據需要更改它。

+0

哦,這是錯誤的。相互進口給了我heebie jeebies。 – 2011-05-15 21:32:29

+0

然後你只是不知道你在做什麼。相互進口是完全安全的,並且在給定某些非常明確的限制條件下工作正常 – 2011-05-15 21:33:34

+0

@Ignacio:他們會在這個旨在強調問題的玩具代碼中工作的很好。我懷疑他們會像預期的那樣在真實的事情中工作。即使他們這樣做,他們也會鼓勵模塊之間的模糊線條,這些線條僅用於增加新的功能,並且保留舊模塊比原來更加困難。我無法想象一種情況,即相互進口的效果比第三種模式更好。 – 2011-05-15 21:35:51

5

嗯,這是我的代碼工作正常:

func.py:

import __main__ 
def func(): 
    print(__main__.var) 

爲主。py:

from func import func 

var="It works!" 
func() 
var="Now it changes!" 
func() 
+0

我喜歡這個解決方案,它的工作原理......但是eclipse給了我一個'Undefined從import導入的變量:var'導入的任何變量或函數的錯誤。任何方式來解決這個問題? – user4061565 2015-04-27 15:53:03

+0

請參閱[如何做 - 我 - 修復 - pydev - undefined - 變量從導入錯誤](https://stackoverflow.com/questions/2112715/how-doi-i-fix-pydev-undefined-variable-從進口-錯誤) – user4061565 2015-04-27 19:01:13

相關問題