2017-10-13 99 views
2

我有名稱的模塊my_module.py 這裏面模塊有一個函數my_function如何聲明一個變量被導入模塊使用

def myFunction(): 
    print my_variable 

顯然,當這種函數被調用它打印my_variable它尚未實例化。所以,從模塊內部調用myFunction()會導致執行崩潰。

現在,除了my_module.py我還有一個名爲my_app.py的腳本位於同一個文件夾中。

my_app.py內部我正在導入my_module.py並在其名稱空間下實例化my_variablemy_variable之後被實例化我打電話my_module.myFunction()它拿起my_variable並打印其背景的:

import module 
module.my_variable = 'this variable is instantiated inside of another script' 
module.myFunction() 

雖然這種方法我不知道如果設計得當。是否有其他方式來實例化imported module以外的變量以供此imported module使用?

+3

術語挑剔:Python並不變量聲明。但無論如何,這聽起來像你應該通過一個參數的功能,而不是依靠全球狀態...... –

+0

當然。它通過名稱來引用它們。 – alphanumeric

+0

我不確定你在這方面的含義。但不管怎麼說,你已經在Python中聲明瞭一個變量是不正確的。 –

回答

-1

我不確定你想達到什麼目標,但是最好不要改變「全局」變量。每當你想在你的代碼中使用my_function()時,你必須首先明確地改變my_variable,如果其他函數/方法依賴於代碼,這會在代碼中觸發副作用。最好的辦法是重寫my_function(),使其接受my_variable作爲參數

+0

我以'my_function()'爲例。因此,解釋起來相對簡單。有時候我們需要一個全局範圍變量。因此,每個被導入的模塊都可以訪問同一個對象或變量。 – alphanumeric

+0

例如,數據庫連接對象可以共享爲「真正」全局變量。假設程序中有幾個模塊需要數據庫連接對象。當然,我們可以在每個模塊中實例化DB連接對象。或者我們可以用這樣的方式編寫模塊函數,使得它們將連接對象作爲參數。但我認爲這是很多工作。如果我們只是實例化一個數據庫連接對象並使其可用於所有導入的模塊,那將會非常簡單。 – alphanumeric

+0

我太快讀了你的問題。我想你沒有改變任何東西,只試圖在'my_module'之外實例化'my_variable',對嗎?那麼'my_function'沒有乾淨的方式來知道它的包含範圍之外的任何變量,它是'my_module'。當您執行'import my_module'時,您將'my_module'中的名稱綁定到'my_app'。這意味着您可以從'my_app'中訪問'my_module'中的所有名稱,而不是相反。但是,它使用'__builtin__'進行破解,這非常危險。所以傳遞'my_variable'作爲參數仍然是最好的方法。 – spidertothefly127

0
import module 
module.my_variable = 'this variable is instantiated inside of another script' 
module.myFunction() 

雖然這種方法我不知道如果設計得當。

不,這個設計不正確。一種正確的方法是明確地將值傳遞給函數。

是否有其他方法來實例化導入模塊之外的變量以供此導入的模塊使用?

只是有另一個模塊是你聲明這個變量。例如my_vars.py

my_variable = 'this variable is instantiated inside of another script' 

然後在my_module.py

import my_vars 

def myFunction(): 
    print my_vars.my_variable