导入该模块时是否需要继承python模块的导入?

时间:2014-02-05 07:00:10

标签: python import

现在已经很晚了,我对进口内的进口(进口内)感到困惑。对于这个问题,你将不得不忍受我的“应用程序”和“帮助者”,因为它们只是解释我的python项目结构的工具。

案例1:进口中的进口

假设一个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或两者中?

案例2:进口内进口导入......

此外,假设我有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条款中。

3 个答案:

答案 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