如果我這樣做蟒蛇 - 遍歷各種進口
import my_import
from my_import import *
我可以做這樣的事情
my_import.k = 6
如果我想改變爲k的每個值更改進口變量我用過的單一導入,是否有一種方法可以迭代所有導入並在每個導入中設置k的值?
基本上我尋找類似
for each x in [list of imports]
x.k = 6
如果我這樣做蟒蛇 - 遍歷各種進口
import my_import
from my_import import *
我可以做這樣的事情
my_import.k = 6
如果我想改變爲k的每個值更改進口變量我用過的單一導入,是否有一種方法可以迭代所有導入並在每個導入中設置k的值?
基本上我尋找類似
for each x in [list of imports]
x.k = 6
有一些原因想這一點,但它是一個危險的遊戲。
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',以及和改變它。也許在模塊鍵名稱中添加一個「內置」檢查。
如果你只是想改變導入的模塊對象的屬性值,你可以使用函數__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]:
順便說一句,在列表理解和發電機十分相似,雖然。 當您有大量模塊需要處理時,建議您更多地使用發電機,並且無需一次性全部導入它們。。這是更高效和節省內存。
謝謝,我會研究這個。 – user3475234 2014-10-12 20:31:24
你爲什麼認爲你需要這樣做? – jonrsharpe 2014-10-12 07:30:22
@jonrsharpe我試圖自動分級學生的作業。將會有大約90個具有不可預知名稱的文件,並且每個文件被假定在文件的頂部具有名爲「k」的變量。雖然我只需要一次導入這些文件中的一個,但我覺得更有可能會遍歷所有導入的功能,而不是以某種方式使用單個變量或某物來切換導入模塊的名稱。但是,我可能是錯的,在這種情況下,我會很有興趣知道如何做到這一點。 – user3475234 2014-10-12 20:29:04
將結構賦值爲明智,這樣你就不必像這樣注入一個變量 - 爲什麼不能這樣呢?讓它成爲一些'main'入口點函數的參數? – jonrsharpe 2014-10-12 20:32:43