Python:通配符子集导入

标签 python import wildcard

我们都被告知使用 from module import *是个坏主意。但是,有没有办法导入 module 内容的子集?使用通配符?

例如:

模块.py:

MODULE_VAR1 = "hello"
MODULE_VAR2 = "world"
MODULE_VAR3 = "The"
MODULE_VAR4 = "quick"
MODULE_VAR5 = "brown"
...
MODULE_VAR10 = "lazy"
MODULE_VAR11 = "dog!"
MODULE_VAR12 = "Now"
MODULE_VAR13 = "is"
...
MODULE_VAR98 = "Thats"
MODULE_VAR99 = "all"
MODULE_VAR100 = "folks!"

def abs():
    print "Absolutely useful function: %s" % MODULE_VAR1

显然我们不想使用 from module import *因为我们会覆盖 abs功能。但是假设我们确实想要所有 MODULE_VAR*可在本地访问的变量。

简单地说from module import MODULE_VAR*不起作用。有没有办法做到这一点?

我用了 100 个变量作为例子,因为做 from module import MODULE_VAR1, MODULE_VAR2, MODULE_VAR3, ..., MODULE_VAR100如果添加更多变量(例如 MODULE_VAR101),显然会非常笨重并且无法工作。

最佳答案

你可以为此使用一个辅助函数 - 无需魔法即可完成:

import re

def matching_import(pattern, module, globals):
    for key, value in module.__dict__.items():
        if re.findall(pattern, key):
            globals[key] = value

现在,你可以这样做:

from utils import matching_import
import constants

matching_import("MODULE_VAR.*", constants, globals())

以这种方式显式使用 globals() 可以避免通常被认为是有害的帧内省(introspection)魔法。

关于Python:通配符子集导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226390/

相关文章:

python - Pydantic:验证嵌套模型

mysql - 以下 MySQL csv 导入查询术语是什么意思?

Java方法参数给出编译错误 "Unexpected bound"

python - 函数定义上的正则表达式 findall。想要匹配参数但不匹配函数

python - 我可以在一个 Tkinter (tk.Tk) 根窗口中使用两个不同的 TTK 主题吗?

python - 在 Numpy 中遍历二维线?

python - 如何比较两个列表的无序列表及其内部的无序列表?

matlab - 将带有标题的矩阵转换为 .txt 文件

java - 如何将一个 Eclipse 项目作为库导入到另一个项目中?

java - 创建Iterable并直接传入值