2014-10-12 67 views
-1

如果我這樣做蟒蛇 - 遍歷各種進口

import my_import 
from my_import import * 

我可以做這樣的事情

my_import.k = 6 

如果我想改變爲k的每個值更改進口變量我用過的單一導入,是否有一種方法可以迭代所有導入並在每個導入中設置k的值?

基本上我尋找類似

for each x in [list of imports] 
    x.k = 6 
+3

你爲什麼認爲你需要這樣做? – jonrsharpe 2014-10-12 07:30:22

+0

@jonrsharpe我試圖自動分級學生的作業。將會有大約90個具有不可預知名稱的文件,並且每個文件被假定在文件的頂部具有名爲「k」的變量。雖然我只需要一次導入這些文件中的一個,但我覺得更有可能會遍歷所有導入的功能,而不是以某種方式使用單個變量或某物來切換導入模塊的名稱。但是,我可能是錯的,在這種情況下,我會很有興趣知道如何做到這一點。 – user3475234 2014-10-12 20:29:04

+0

將結構賦值爲明智,這樣你就不必像這樣注入一個變量 - 爲什麼不能這樣呢?讓它成爲一些'main'入口點函數的參數? – jonrsharpe 2014-10-12 20:32:43

回答

1

有一些原因想這一點,但它是一個危險的遊戲。

import my_import1 
import my_import2 
import my_import3 
import sys 

# Check if you don't believe me 
print(my_import1.x) 
print(my_import2.x) 
print(my_import3.x) 

# Grab the interesection of all loaded modules and globals in this scope 
allmodules = [sys.modules[name] for name in set(sys.modules)&set(globals())] 

for module in allmodules: 
    module.x = 10000 

# Check if you don't believe me 
print(my_import1.x) 
print(my_import2.x) 
print(my_import3.x) 

輸出:

1 
2 
3 
10000 
10000 
10000 

與此需要說明的是,它會搶 'SYS',以及和改變它。也許在模塊鍵名稱中添加一個「內置」檢查。

1

如果你只是想改變導入的模塊對象的屬性值,你可以使用函數__import__()map()試試這個代碼:

#__import__() & map() 

In [1]: moduleNames = ['my_import1', 'my_import2', 'my_import3'] 

In [2]: for module in map(__import__, moduleNames): 
    ...:  module.k = 1000 
    ...:  

,您可以通過一個由進口此模塊中的一個檢查結果,和輸出第k:

In [3]: import my_import1, my_import2, my_import3 

In [4]: print my_import1.k 
1000 

In [5]: print my_import2.k 
1000 

In [6]: print my_import3.k 
1000 

實際上,可以改變地圖()函數爲列表綜合發生器和代碼將是非常相似的,要求的代碼風格

#List Comprehension 

In [7]: for module in [__import__(m) for m in moduleNames]: 
    ...:  module.k = 2000 
    ...:  

In [8]: print my_import1.k 
2000 

In [9]: print my_import2.k 
2000 

In [10]: print my_import3.k 
2000 

In [11]: 

#Generator 

In [11]: for module in (__import__(m) for m in moduleNames): 
    ....:  module.k = 3000 
    ....:  

In [12]: print my_import1.k 
3000 

In [13]: print my_import2.k 
3000 

In [14]: print my_import3.k 
3000 

In [15]: 

順便說一句,在列表理解和發電機十分相似,雖然。 當您有大量模塊需要處理時,建議您更多地使用發電機,並且無需一次性全部導入它們。。這是更高效和節省內存。

+0

謝謝,我會研究這個。 – user3475234 2014-10-12 20:31:24