【问题标题】:python - iterate over various importspython - 遍历各种导入
【发布时间】:2014-10-12 07:23:26
【问题描述】:

如果我这样做

import my_import
from my_import import *

我可以通过执行类似的操作来更改导入中的变量

my_import.k = 6

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

基本上我正在寻找类似的东西

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

【问题讨论】:

  • 你认为你为什么需要这样做?
  • @jonrsharpe 我正在尝试自动为学生的作业评分。将有大约 90 个名称不可预测的文件,并且假定每个文件的顶部都有一个名为“k”的变量。虽然我一次只需要导入其中一个文件,但我觉得更有可能存在迭代所有导入的功能,而不是以某种方式使用单个变量或其他东西来切换导入模块的名称。不过,我可能错了,在这种情况下,我很想知道如何做到这一点。
  • 最好构造分配,这样您就不必注入这样的变量 - 为什么不呢?让它成为一些main入口函数的参数?
  • @jonrsharpe 虽然我意识到这一点,但我不是做作业的人,我只是评分者。学生们被指示将 k 设置为某个值,但也被告知在文件顶部使其易于更改,因此我们需要检查他们的函数是否适用于不同的 k 值(最好不要手动更改每个值) .
  • @jonrsharpe 它是 Harvey Mudd 教科书/实验室练习的创建者:cs.hmc.edu/twiki/bin/view/ModularCS1/ImageCompression!给学生的唯一额外说明是让 k 可变,如果他们遵循实验室提供的规范,他们很可能会将 k 设置在他们编写的函数之外——如果他们直接遵循实验室,他们' d 可能只是将数字“5”硬编码到他们的提交中。 CS学生简介。 :P

标签: python variables import iteration


【解决方案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”并对其进行更改。也许在模块键名中添加对“内置”的检查。

【讨论】:

    【解决方案2】:

    如果你只是想改变导入模块对象的属性值,你可以试试这个代码使用函数__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 ComprehensionGenerator代码将与您要求的代码风格非常相似

    #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]: 
    

    顺便说一句,列表理解和生成器非常相似。 当您需要处理大量模块并且不需要一次全部导入时,更推荐使用生成器。它更高效,更节省内存。

    【讨论】:

    • 谢谢,我会调查的。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 2021-12-24
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多