Python:通配符子集导入

fdm*_*ion 10 python import wildcard

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

例如:

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
Run Code Online (Sandbox Code Playgroud)

显然我们不想使用,from module import *因为我们要覆盖这个abs功能.但是假设我们DID希望所有MODULE_VAR*变量都可以在本地访问.

简单地推杆from module import MODULE_VAR*不起作用.有没有办法实现这个目标?

我使用了100个变量作为说明,因为from module import MODULE_VAR1, MODULE_VAR2, MODULE_VAR3, ..., MODULE_VAR100如果添加更多变量(例如MODULE_VAR101),那么显然会非常难以操作并且无法工作.

jsb*_*eno 8

你可以拥有一个帮助函数 - 它可以在没有魔法的情况下完成:

import re

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

现在,你可以这样做:

from utils import matching_import
import constants

matching_import("MODULE_VAR.*", constants, globals())
Run Code Online (Sandbox Code Playgroud)

globals()以这种方式明确地使用避免了帧内省魔法,这通常被认为是有害的.


kuu*_*ujo 5

__all__使用import *语法时,可以使用变量导入特定的变量。

mymodule.py

__all__ = [
  'MODULE_VAR1',
  'MODULE_VAR2',
  'MODULE_VAR3',
  'MODULE_VAR4',
  'MODULE_VAR5',
]

MODULE_VAR1 = "hello"
MODULE_VAR2 = "world"
MODULE_VAR3 = "The"
MODULE_VAR4 = "quick"
MODULE_VAR5 = "brown"

def abs():
  print "Absolutely useful function: %s" % MODULE_VAR1
Run Code Online (Sandbox Code Playgroud)

然后我们可以这样使用它:

from mymodule import *
print MODULE_VAR1 # hello
print abs # <built-in function abs>
Run Code Online (Sandbox Code Playgroud)

使用导入模块时*,Python会在模块中检查一个__all__变量,该变量可以覆盖否则将被视为模块中普通的“公共”变量的变量(该变量不是以下划线开头的变量),并允许您明确定义哪些变量是“公共”的。看看这个问题