14

除了一些明确指定的方法之外,现有 Python 模块中的import所有内容 ( )是否可行?*

(背景:针对推荐的 Python 实践,在FEniCS中很常见from dolfin import *。一些方法名称包含字符串“Test”(例如,TestFunction()),并且被鼻子误认为是单元测试。)

4

3 回答 3

17

如果您无权访问该模块,您也可以简单地从全局命名空间中删除这些方法或变量。这是如何做到的:

to_exclude = ['foo']

from somemodule import *

for name in to_exclude:
    del globals()[name]
于 2013-11-13T15:38:02.960 回答
11

是的,您可以定义__all__模块

添加

__all__ = ["echo", "surround", "reverse"] #Or whatever your module names are

到具有这些模块的文件,或__init__.py您要从中导入的包的文件。

现在

from module import * 

导入指定的模块__all__

于 2013-11-13T15:28:20.503 回答
0

@alexander-zhukov 的解决方案在大多数情况下都可以工作,但当导入的模块巧合地包含一个名为globals.

例如,

to_exclude = ['abort']
from flask import *
for name in to_exclude:
    del globals()[name]

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: 'module' object is not callable

该错误是因为该flask包包含一个名为globals(无法调用)的命名空间,它将覆盖您当前的全局符号globals

以下解决方案适用于烧瓶和其他:

to_exclude = ['abort']
from flask import *
for name in to_exclude:
    __builtins__.globals().pop(name)

然而可笑的是,如果您打开 Python 控制台并手动输入命令,它就不起作用。我认为这是 Python 3 的一个缺陷。如果您希望它在 Python 控制台中工作,那么您必须显式导入builtins模块:

import builtins
to_exclude = ['abort']
from flask import *
for name in to_exclude:
    builtins.globals().pop(name)
于 2021-09-30T04:40:59.590 回答