使用Python3包导入-是否有避免书写“点”的方法?

时间:2018-08-09 09:09:34

标签: python-3.x package

假设我有一个包含内容的text.py文件

text = u'Wenn ist das Nunst\u00fcck git und Slotermeyer?'

和带有内容的文件joke.py

from text import text    
def joke(): return text

可以导入到同一目录中的另一个python脚本。我想将其转换为包并创建结构

/funniest
  setup.py
  /funniest
    joke.py
    text.py

要使其正常工作,我需要添加 dot from .text import text,但是如果某些用户想要在funniest/funniest中使用它,那么这当然是行不通的文件夹,以旧方式

>> from joke import joke

是否有一种方法可以使导入既可以作为本地导入也可以在软件包中“使用”? (在Python2中,似乎在两个用例中都没有圆点就可以了)。

还是故意在这些用例之间做出明确区分?

1 个答案:

答案 0 :(得分:1)

在最有趣的目录(与__init__.py相同的目录)中添加文件text.py。这会将这个目录变成一个(简单的)python包。 然后,您可以写from funniest.text import textimport funniest.joke。 在python 3中,所有导入都是绝对的,除非您至少加一个“”。表示相对。 这是为了避免python 2的不一致,如果它没有发现它是相对的,它将名称命名为绝对。

您的示例通常是这样做的原因: from text import text

“来自文本”是模棱两可的:您是指当前目录中的“ text.py”模块(相对)还是python运行时库的“ text.py”模块(绝对)。

在模块内部,可以使用相对导入(带点),在模块外部,可以使用绝对导入。

如果您希望脚本在python 2.7和python 3中具有相同的行为,请使用: from __future__ import absolute_import

这会强制python 2充当python 3的导入,因此编写import语句与两个版本都一致(前提是您编写的模块可同时用于两个版本)。