如何只导入__init__.py的一部分?

时间:2019-01-08 19:04:17

标签: python

我有一个带有一些文件的包装,并且有一些进口问题。 假设我有以下文件:

main.py
Lib
 ├─ __init__.py
 ├─ file1.py
 └─ file2.py

main.py

from Lib import ClassA

foo = ClassA('anything')

库/init.py

from .file1 import ClassA
from .file2 import ClassB

file1.py

import a_lot_of_things

class ClassA:
  pass

file2.py

import a_lot_of_other_things

class ClassB:
  pass

此代码有效,但是Python还将导入文件中的所有其他类,作为ClassB。问题在于,Python需要花费很多时间来导入所有我不想使用的file2.py库。

我知道它的发生是因为Python正在运行init.py并且它正在导入所有类,即使我只要求一个类。但是我认为只有在我写以下内容时,它才应该这样做:

from Lib import *

是否可以在init.py中检查是否要导入全部或仅一个特定的类来仅运行此文件/导入?

我也尝试过这样构造目录:

main.py
Lib
 ├─ __init__.py
 ├─ ClassA
 │   ├─ __init__.py
 │   └─ file1.py
 └─ ClassB 
     ├─ __init__.py
     └─ file2.py

所以我清理了Lib / init.py并将导入内容放入每个init.py中。

ClassA / init.py

from .file1 import ClassA

ClassB / init.py

from .file2 import ClassB

但是现在我需要以这种方式使用它:

main.py

from Lib import ClassA

foo = ClassA.ClassA('anything')

就像我之前写的那样,我想直接使用它。有办法吗?

1 个答案:

答案 0 :(得分:0)

如果您导入模块(或从模块中导入内容),则该模块导入的所有内容也将被导入。

您只能通过将导入放置在本地上下文中来避免这种情况

例如

my_module:

import some_stuff

def do_stuff()
    pass

def do_some_specific_things()
    import some_specific_stuff_only_relevant_to_this_function
    pass

如果您现在呼叫from my_module import do_stuff,则将执行import some_stuff,但不会执行import some_specific_stuff_only_relevant_to_this_function

顺便说一下,按如下所示构造代码是没有道理的:

main.py
Lib
 ├─ __init__.py
 ├─ ClassA
 │   ├─ __init__.py
 │   └─ file1.py
 └─ ClassB 
     ├─ __init__.py
     └─ file2.py

一个类在模块内(file1file2是模块)。一个模块不能坐在一个类中。