现在已经很晚了,我对进口内的进口(进口内)感到困惑。对于这个问题,你将不得不忍受我的“应用程序”和“帮助者”,因为它们只是解释我的python项目结构的工具。
假设一个python脚本app.py从app_helper.py导入一个模块。 app_helper.py的唯一要点是帮助app.py.它永远不会自行运行。
app.py
from app_helper import datechecker
import ...
date_val = 20140101-1010
print datechecker(date_val)
app_helper.py
import ...
def datechecker(date_val):
if (datetime.date.today().year - int(date_val[:4])) < 0:
return "Error: Invalid year (YYYY) in %s. Too high." % date_val
else:
return True
import datetime
是否需要位于app.py,app_helper.py或两者中?
此外,假设我有app_helper_helper.py,app_helper导入。就像app_helper一样,app_helper_helper永远不会自己执行,它只是由app_helper调用,只能由app.py调用。在这种情况下,app_helper.py中有一些我没有显示的内容。
app_helper.py
from app_helper_helper import decision
import ...
def datechecker(date_val):
if (datetime.date.today().year - int(date_val[:4])) < 0:
return "Error: Invalid year (YYYY) in %s. Too high." % date_val
else:
return decision()
app_helper_helper.py
import ...
def decision():
x = random.random()
if x > .5:
return True
return False
那么进口在哪里?
案例1的答案应确定import random
在这两个模块的位置,但app.py也需要import random
吗? import decision
怎么样? app.py需要做什么吗?或者app_helper.py会处理它吗?最重要的是,如果app.py还需要使用app_helper_helper的决策功能,那么app.py和app_helper.py都需要from app_helper_helper import decision
或者只是app.py吗?
我知道http://docs.python.org/2/tutorial/modules.html应该涵盖了大部分的基础,但我想我只需要有人将其放在我的条款或app-app_helper-app_helper_helper条款中。
答案 0 :(得分:3)
考虑以下两个脚本:
module1.py
import random
import module2
module2.py
print random.random() # NameError: name 'random' is not defined
module2
不了解random
,可能很好地定义了自己的名为random
的对象。尽管不鼓励,但它不是禁止的。对于random
,内置模块,期望不会影响它。但是有数以千计的其他软件包可以下载,所有软件包都使用自己的模块名称。不能指望你避免所有这些。
因此,要使用模块的功能,无论是内置random
,下载的软件包还是您自己的模块,调用模块必须导入它。否则它无法知道。
在多个位置导入模块的开销很小。代码未加载两次。它仅被引用两次。
简而言之,在您需要的模块中导入所需的内容。
答案 1 :(得分:2)
如果表达式datetime.date
仅出现在app_helper.py
中,那么唯一需要import datetime
的模块是app_helper.py
。
同样,如果表达式random.random
出现的唯一模块是app_helper_helper.py
,那么唯一需要import random
的模块是app_helper_helper.py
。
更高级别的模块可以幸福地忽略低级模块的导入。
答案 2 :(得分:1)
如果模块A中的代码(即用A.py
编写的代码)需要使用模块B,则模块A需要导入模块B.就是这样。
因此,如果app_helper
引用datetime
,则需要执行import datetime
(或from datetime import datetime
或某些此类事情,具体取决于具体需要使用的内容)。如果app
未引用datetime
,则无需执行import datetime
。