python - 迭代各种导入

时间:2014-10-12 07:23:27

标签: python variables import iteration

如果我做的话

import my_import
from my_import import *

我可以通过执行类似

的操作来更改导入中的变量
my_import.k = 6

如果我想为我使用的每一个导入更改k的值,有没有办法让我迭代所有导入并在每个导入中设置k的值?

基本上我正在寻找像

这样的东西
for each x in [list of imports]
    x.k = 6

2 个答案:

答案 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,列表理解和生成器非常相似。 当您需要处理大量模块而不需要一次性导入所有模块时,建议使用生成器。它更有效,更节省内存。