如果我做的话
import my_import
from my_import import *
我可以通过执行类似
的操作来更改导入中的变量my_import.k = 6
如果我想为我使用的每一个导入更改k的值,有没有办法让我迭代所有导入并在每个导入中设置k的值?
基本上我正在寻找像
这样的东西for each x in [list of imports]
x.k = 6
答案 0 :(得分: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 :(得分: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
实际上,您可以将map()函数更改为列表理解或生成器,,代码将非常类似于您苛刻的代码风格强>:
#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]:
但是,BTW,列表理解和生成器非常相似。 当您需要处理大量模块而不需要一次性导入所有模块时,建议使用生成器。它更有效,更节省内存。