当前位置: 首页 > 面试题库 >

如何在(子)模块中使用__init__.py定义名称空间?

蓟清野
2023-03-14
问题内容

我的问题是关于编写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.pybar.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 *也不被认为是好的。

或者,foobar包应该有更多在它喜欢foo.function1foo.other_funcbar.drink等这使得它更加人性化理解的组织。

示例和参考文献不在适用于StackOverflow良好问题的范围内,但以下是一些经过深思熟虑的问题:

  • 结构化项目—《 Python旅行者指南》
  • 组织模块和包的Python方式
  • 如何组织一个Python项目?


 类似资料:
  • 问题内容: 我正在学习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)。另外,我试图生成命名空间,但在输出中没有生成命名空间。