如何正确导入

时间:2015-03-26 20:25:26

标签: python python-2.7

我一直想知道如何适当地导入Python,与我现在要解释的方式有关:

想象一下,我自己构建了两个模块,moduleamoduleb,最后一个模块同时使用了moduleab,所以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 之前导入moduleba也应该可以访问它,而不仅仅是正在运行的脚本;同样的,我想它会发生在a

假设这是真的,我认为,如果导入只在一行中完成,它会起作用吗?在语句完成后(单行导入调用),是否将模块逐个导入并包含在脚本中,或者它们是否完全导入并启用它们?

modulec

如果确实如此,它是否会缩短代码的处理时间,或者它是否基本相同,尽管美学问题?

3 个答案:

答案 0 :(得分:9)

你太过于思考。

每个模块必须是“自包含”的,因为它本身满足其依赖性。如果modulea需要moduleb,则执行

# modulea.py
import moduleb

然后moduleb必须导入其依赖项,如果有的话:

# moduleb.py
import json  # for instance

最后modulec需要moduleamoduleb,您只需导入它们:

# 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 *

虽然通常最好导入使用它的模块中的所有内容,但有些条件是不可取的。我有一个项目,其中包含许多测试产品功能的小脚本。在每个进口中都要进行大量的进口是很麻烦的。