从_uinit__uu.py导入Python中的文件

从_uinit__uu.py导入Python中的文件,python,import,module,Python,Import,Module,假设我有以下结构: app/ __init__.py foo/ a.py b.py c.py __init__.py a、 py、b.py和c.py共享一些常见的导入(日志、操作系统、re等)。是否可以从\uuuu init\uuuuuu.py文件导入这三个或四个通用模块,这样我就不必在每个文件中导入它们 编辑:我的目标是避免在每个文件中导入5-6个模块,这与性能无关。不,它们必须放在每个模块的名称空间中,因此您必须以某种方式导入它们(除非您将日志记录作

假设我有以下结构:

app/
  __init__.py
  foo/
    a.py
    b.py
    c.py
    __init__.py
a、 py、b.py和c.py共享一些常见的导入(日志、操作系统、re等)。是否可以从
\uuuu init\uuuuuu.py
文件导入这三个或四个通用模块,这样我就不必在每个文件中导入它们


编辑:我的目标是避免在每个文件中导入5-6个模块,这与性能无关。

不,它们必须放在每个模块的名称空间中,因此您必须以某种方式导入它们(除非您将
日志记录作为函数参数传递,至少可以说这是一种奇怪的方式)

但是模块无论如何只导入一次(然后放入
a
b
c
名称空间),所以不要担心使用太多内存或类似的东西


当然,您可以将它们放在一个单独的模块中,并将其导入到每个
a
b
c
,但是每次都必须导入这个单独的模块。

您可以使用一个公共文件,例如
include.py
,来完成此操作,但它违背了推荐的做法,因为它涉及通配符导入。考虑以下文件:

app/
    __init__.py
foo/
    a.py
    b.py
    c.py
    include.py <- put the includes here.
    __init__.py

如上所述,不建议这样做,因为不鼓励通配符导入。

是的,但不要这样做。说真的,不要。但是如果你还想知道怎么做的话,它看起来是这样的:

import __init__

re = __init__.re
logging = __init__.logging
os = __init__.os

我说不要这样做,不仅是因为它凌乱而毫无意义,而且还因为您的包实际上不应该像那样使用
\uuuu init\uuuuuuuy.py
。这是程序包初始化代码。

如果出于性能原因,您想这样做,请不要担心-导入已加载的模块非常快(在sys.modules上进行简单的dict查找)。编辑问题以澄清我的动机。您不认为所述目标有点降低代码可读性吗?根本问题是Python没有程序包范围,只有模块范围。包在Python中并不是一流的构造,它们在后来被栓接在一起,它们真正做的只是允许模块的虚线表示法。也许可以为它创建一个PEP?+1表示通配符。愚蠢的一致性是小头脑的妖怪。无法合理地对相关导入进行分组是python的一个缺点;因此,它必须服从于通配符。我不会说它毫无意义。您希望应用于所有代码的某些内容,例如将来导入unicode文本时的
。我真的必须把它放在每个文件中(然后忘记一些,导致很难找到bug)?
import __init__

re = __init__.re
logging = __init__.logging
os = __init__.os