我的问题是关于编写Python(3.x)软件包和(子)模块以及__init__.py
文件的正确用法以声明名称空间。
我曾经用C ++编写代码,所以我喜欢使用很多单独的文件来组织项目。例如,(imo)如果一个模块包含多个类,则每个类应位于单独的文件中。
由于我没有使用Python进行开发的经验,因此很难用一个简单的问题来表达我的想法。因此,让我们以下面的小python包为例。
dir
|
+-- example
| |
| +-- script.py
|
+-- package
|
+-- __init__.py
|
+-- foo.py
|
+-- subpackage
|
+-- __init__.py
|
+-- bar.py
让我们看一下文件。
package/foo.py
:
def foo:
print('foo')
package/subpackage/bar.py
:
def bar:
print('bar')
以下example/script.py
工作正常。
import sys
sys.path.insert(0, '..')
import package
import package.subpackage
package.foo.foo()
package.subpackage.bar.bar()
我不喜欢使用package.foo.foo()
/
package.subpackage.bar.bar()
,而是想使用package.foo()
/
package.subpackage.bar()
。
而且我不想使用from package.subpackage.bar import bar
,因为我不想将子包的名称空间混入脚本中。
我使用__init__.py
文件来实现这一目标。
package/__init__.py
:
from package.foo import foo
package/subpackage/__init__.py
:
from package.subpackage.bar import bar
这是一种类似python的好方法来定义名称空间吗?还是有一种更好/常见的方式来组织python文件包的文件系统。(我没有为此找到合适的教程/示例。)
在file中package/subpackage/__init__.py
,为什么必须是:
from package.subpackage.bar import bar
并不是:
from subpackage.bar import bar
?
这将导致错误:
Traceback (most recent call last):
File "script.py", line x, in <module>
import package.subpackage
File "..\package\subpackage\__init__.py", line x, in <module>
from subpackage.bar import bar
ImportError: No module named 'subpackage'
这是一种类似python的好方法来定义名称空间吗?还是有一种更好/常见的方式来组织python文件包的文件系统。(我没有为此找到合适的教程/示例。)
这是设置Python包的 不错 方法。只有 还好 并没有因为内容“好”foo.py
和bar.py
。
我不喜欢使用
package.foo.foo()
/
package.subpackage.bar.bar()
,而是想使用package.foo()
/
package.subpackage.bar()
。
在这种情况下,您不能这样做。不混合名称空间是不这样做的充分理由from package.subpackage.bar import bar
。
这本来是更好,如果def foo(): ...
和def bar(): ...
是直接__init__.py
。这样,您可以完成package.foo()
和package.subpackage.bar()
。也可以通过使用__all__
init来完成,但import *
也不被认为是好的。
或者,foo
和bar
包应该有更多在它喜欢foo.function1
,foo.other_func
,bar.drink
等这使得它更加人性化理解的组织。
示例和参考文献不在适用于StackOverflow良好问题的范围内,但以下是一些经过深思熟虑的问题:
问题内容: 我正在学习Python,但无法弄清楚导入的工作方式。 我从Python教程中了解到该文件初始化了一个程序包,并且可以在此处导入子程序包。 不过,我做错了。您能为我(以及将来的Python学习者)解释我做错了什么吗? 这是我正在尝试做的一个简化示例。 这是我的文件结构: 内容: 是空的。 包含: 最后,包含: 这就是我尝试使用OSX终端和Python 3运行hello_world.py的
问题内容: 我正在尝试组织一些模块供我自己使用。我有这样的事情: 在中,如果要导入lib,我想定义一些要使用的类。但是,如果不将这些类分离到文件中并将其导入中,我似乎无法弄清楚。 与其说: 我想要这样的东西: 有可能吗,还是我必须将类分成另一个文件? 编辑 好的,如果我从另一个脚本导入lib,则可以访问Helper类。如何从settings.py访问Helper类? 此处的示例描述了包装内参考。我
问题内容: 我一直在阅读有关文件的功能。据说我们在包含模块的文件夹中需要一个空文件,以便可以导入这些模块。但是,我尝试将文件夹路径添加到PYTHONPATH(Windows 7中为环境变量)。尽管此文件夹不包含文件,但我仍然可以从该文件夹导入模块。您能否解释一下在不存在的情况下如何导入这些模块? 谢谢, 最好的祝福 问题答案: 把一个文件夹变成一个包。这对于创建某种模块层次结构很有用,您可以在其中
问题内容: 我试图了解关于Python(v2.7)导入机制的最佳实践。我有一个项目开始有所增长,可以说我的代码如下组织: 包名称为,在其下方,我有一个模块,其中包含该类的代码。因此,我对包,模块和类使用了相同的名称,但起初可能不太聪明。 为空,需要导入类,因此文件的一部分如下所示: 但是我后来又重新考虑了这一点,并且我认为最好在文件中包含所有导入内容。因此,我现在看起来像: 而我只需要导入: 虽然
问题内容: 我在理解项目中python文件的使用场景或设计目标时遇到了困难。 假设我有“模型”目录(称为包),其中包含以下文件 我发现了两种使用方法: 我有需要使用一个共同的定义,,。我可以用作所有* model.py类的基础/通用定义吗?这意味着我必须导入。 或者,应当具有自己导入的solrmodel.py,mongomodel.py,samodel.py的定义,并且它允许像这样的类或函数的轻松
问题内容: 考虑以下jfiddle http://jsfiddle.net/bchapman26/9uUBU/29/ 我有2个模块(module1和module2)。module1和module2都定义了一个名为myService的服务。当两个模块都导入myApp时,这似乎在Angular中的myService上创建了名称冲突。看来AngularJs仅使用第二个服务定义,而没有警告您可能的问题。
问题内容: 我正在尝试使用该函数进行复制,但似乎遇到了麻烦。 一个简单的例子很简单: 我遇到的问题是我正在从子包中导入名称(即): 所以我想要的是 但这只是导入了顶级包,而不是子包: 问题答案: 该函数将返回包的顶级模块,除非您传递了非空参数: 请参阅该函数的Python文档。
我正在尝试使用camel Bindy将管道分隔的字符串数据转换为xml。但它正在生成标记和类名。此外,我想添加命名空间到我的标记。 我试图使用Camel进程来生成自定义标记,但它不起作用。 输出result.xml 上面发布的是给定转换的输出。在第一个标记中,它打印带有整个包和类名的标记名(例如:com.abc.domain.pojo)。另外,我试图生成命名空间,但在输出中没有生成命名空间。