从__init__.py导入Python文件

Fed*_*les 13 python import module

假设我有以下结构:

app/
  __init__.py
  foo/
    a.py
    b.py
    c.py
    __init__.py
Run Code Online (Sandbox Code Playgroud)

a.py,b.py和c.py共享一些常见的导入(logging,os,re等).是否可以从__init__.py文件中导入这三个或四个常用模块,这样我就不必在每个文件中导入它们了?

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

jkp*_*jkp 14

您可以使用常见文件来执行此操作include.py,但这违反了建议的做法,因为它涉及通配符导入.请考虑以下文件:

app/
    __init__.py
foo/
    a.py
    b.py
    c.py
    include.py <- put the includes here.
    __init__.py
Run Code Online (Sandbox Code Playgroud)

现在,a.py等等,做:

from include import *
Run Code Online (Sandbox Code Playgroud)

如上所述,不建议使用,因为不鼓励使用通配符导入.

  • 通配符为+1.愚蠢的一致性是小脑袋的大人物.无法合理地对相关进口进行分组是一个蟒蛇疣; 因此,它必须屈服于通配符. (7认同)

bal*_*pha 11

不,它们必须放在每个模块的命名空间中,所以你必须以某种方式导入它们(除非你logging作为函数参数传递,这将是一种奇怪的做事方式,至少可以说).

但模块仅导入一次呢(然后放入a,bc命名空间),所以不用担心使用太多的内存或者类似的东西.

当然,你可以把它们放入一个单独的模块,并导入到每一个a,bc,但这种单独的模块仍然必须进口每次.


Eva*_*ark 6

是的,但不要这样做.说真的,不要.但如果您仍然想知道如何做,它看起来像这样:

import __init__

re = __init__.re
logging = __init__.logging
os = __init__.os
Run Code Online (Sandbox Code Playgroud)

我说不要这样做,不仅因为它的杂乱而且毫无意义,还因为你的包装并不是真的应该这样使用__init__.py.它是包初始化代码.