我一直想知道如何适当地导入Python,与我现在要解释的方式有关:
想象一下,我自己构建了两个模块,modulea
和moduleb
,最后一个模块同时使用了modulea
和b
,所以modulec
。
此外,modulea
使用moduleb
。
这些模块都是单文件,它们构成了一个拥有自己的__init__.py
文件的大模块的一部分。
+ My project
-
-> modulea.py
-> moduleb.py
-> modulec.py
-> __init__.py # Here I import modulea, b, c.
-> main_module.py # This is were I do all the hardcore.
我已经创建了一个文件,用于导入我需要的所有模块,而不是在每个脚本中逐个导入它们,并且要知道我是否已经导入它,我必须检查文件是否为文件已经导入了这个。
我可以简单地声明,正如您在评论框中所说,每个模块中所需的模块,但我认为这不实用,只能在一个模块中导入它们更容易文件。
告诉我这是不是一个好习惯。
如果我导入
import modulea
import moduleb
import modulec
它无法正常工作(ImportError
),因为modulea
并未在代码中隐式导入moduleb
,而是在导入之前导入它所需的模块({{1} }})
如果我做了
b
我猜他们会工作,因为runnning脚本已经在import moduleb
import modulea
import modulec
之前导入moduleb
,a
也应该可以访问它,而不仅仅是正在运行的脚本;同样的,我想它会发生在a
。
假设这是真的,我认为,如果导入只在一行中完成,它会起作用吗?在语句完成后(单行导入调用),是否将模块逐个导入并包含在脚本中,或者它们是否完全导入并启用它们?
modulec
如果确实如此,它是否会缩短代码的处理时间,或者它是否基本相同,尽管美学问题?
答案 0 :(得分:9)
你太过于思考。
每个模块必须是“自包含”的,因为它本身满足其依赖性。如果modulea
需要moduleb
,则执行
# modulea.py
import moduleb
然后moduleb
必须导入其依赖项,如果有的话:
# moduleb.py
import json # for instance
最后modulec
需要modulea
和moduleb
,您只需导入它们:
# modulec.py
import modulea
import moduleb # <-- actually this import does not reload the moduleb, since it was already loaded in modulea, and it was cached.
没有更多相关内容。
如果你只需要一个模块中的函数,你可以将其导入到这样的命名空间中。
from moduleb import my_cool_function
就像样式约定一样,您应该在新行中进行每次导入:
import json
from moduleb import my_cool_function
from moduleb import another_not_so_cool_function
答案 1 :(得分:3)
根据python style guide,您应该为每个单独的模块使用import语句。它还将告诉您有关导入模块的约定所需的其他一切。
import moduleb
import modulea
import modulec
此外,正如一些评论者指出的那样,您似乎并未在每个脚本中正确导入这些模块,因此在此脚本中会产生错误。
答案 2 :(得分:1)
如果您愿意,可以将所有商品放入一个地方。
的myproject / internal.py
from moduleb import *
from modulea import *
from modulec import *
现在,您的其他模块可以导入它
的myproject / modulec.py
from internal import *
虽然通常最好导入使用它的模块中的所有内容,但有些条件是不可取的。我有一个项目,其中包含许多测试产品功能的小脚本。在每个进口中都要进行大量的进口是很麻烦的。