2016-01-13 62 views
1

假设您创建了一个名为app的Python程序包,它包含一个名为foo的模块,该模块具有一个名为say_hello的功能,该功能将Hello!打印到控制台。何时需要修改Python __init__文件?

假设您还创建了第二个名为boss_app的Python程序包,该程序包有一个模块mainappboss_app位于相同的目录中,并且该目录位于Python路径中。此外,__init__文件全部为空。其结构是:

app 
    __init__.py 
    foo.py 
boss_app 
    __init__.py 
    main.py 

我想导入到app这样boss_app.main我可以调用app.foo.say_hello

我使用这个命令:

import app 

app.foo.say_hello() 

,我希望在控制台中看到:

>>>> Hello! 

相反,我得到的行为是app进口它没有访问foo

我想出了解决的办法是修改app.__init__,使其包含以下命令:

from .foo import * 

现在,我得到预期的行为。

是否总是需要创建一个自定义__init__的包,如果该包将被从外面包进口?

+0

如果你想具体'进口app.foo'才可以使用'app.foo.say_hello()',那么它完全没有离开'__init __。py'空。因此,您真的可以选择与您想要的命名空间相比多少便利。 – Evert

+0

但是,如果我想'导入应用程序'并有权访问它的名称空间,那么我必须修改'__init__'的权利? –

+1

推荐阅读:https://docs.python.org/3/tutorial/modules.html – jonrsharpe

回答

1

import app 

只运行app/__init__.py并使其初始化提供用作app.SOMENAME一切。如果你想app.foo模块可用,你需要说import app.foo。这将加载模块。这种区别的一个常见例子可能是import os vs import os.path。正因为你说import os,你将不会有os.path包的内容可用。

你不必打破模块到包,但它有助于避免模块名称冲突。它也可能有助于使这些模块的用户清楚地理解概念。

+0

这似乎可以成为我的问题的答案。但是,在你的例子中,如果我导入'import os',我仍然可以做一些类似'os.path.exists(file_name)'的操作。我没有看过关联的'__init__'文件。它可以很好地包含适当的进口声明。你怎么看? –

+1

是的,这意味着'os'模块内有一个'path'类(并且存在)。 –

+0

所以你说的是,一个空白的'__init__'将允许类没有额外的努力被识别,但没有与类没有关联的功能? –