__init__.py在Python源目录中用于什么?
当前回答
尽管Python在没有__init__.py文件的情况下工作,但仍应包含一个。
它指定目录应被视为一个包,因此包含它(即使它是空的)。
还有一种情况是,您可能实际使用__init__.py文件:
假设您具有以下文件结构:
main_methods
|- methods.py
而methods.py包含以下内容:
def foo():
return 'foo'
要使用foo(),您需要以下选项之一:
from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()
也许您需要(或希望)将methods.py保存在main_methods(例如运行时/依赖项)中,但您只希望导入main_method。
如果将methods.py的名称更改为__init__.py,则可以通过导入main_methods来使用foo():
import main_methods
print(main_methods.foo()) # Prints 'foo'
这是因为__init__.py被视为包的一部分。
一些Python包实际上做到了这一点。一个例子是JSON,其中运行import JSON实际上是从JSON包中导入__init__.py(请参阅此处的包文件结构):
源代码:Lib/json/__init__.py
其他回答
在Python中,包的定义非常简单。与Java一样,层次结构和目录结构是相同的。但是你必须在包中包含__init__.py。我将用下面的示例解释__init__.py文件:
package_x/
|-- __init__.py
|-- subPackage_a/
|------ __init__.py
|------ module_m1.py
|-- subPackage_b/
|------ __init__.py
|------ module_n1.py
|------ module_n2.py
|------ module_n3.py
__init__.py可以是空的,只要它存在。它表示目录应被视为一个包。当然,__init__.py也可以设置适当的内容。
如果我们在module_n1中添加函数:
def function_X():
print "function_X in module_n1"
return
运行后:
>>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()
function_X in module_n1
然后我们遵循层次结构包并调用module_n1函数。我们可以在subPackage_b中使用__init__.py,如下所示:
__all__ = ['module_n2', 'module_n3']
运行后:
>>>from package_x.subPackage_b import *
>>>module_n1.function_X()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named module_n1
因此,使用*importing,模块包受__init__.py内容的约束。
它曾经是包的必需部分(旧的3.3之前的“常规包”,而不是更新的3.3+“命名空间包”)。
这是文档。
Python定义了两种类型的包,常规包和命名空间包。常规包是Python 3.2和更早版本中存在的传统包。常规包通常实现为包含__init__.py文件的目录。导入常规包时,将隐式执行__init__.py文件,它定义的对象将绑定到包的命名空间中的名称。__init__.py文件可以包含任何其他模块都可以包含的Python代码,并且Python将在导入模块时向模块添加一些附加属性。
但只需单击链接,它包含一个示例、更多信息和对命名空间包的解释,这是一种没有__init__.py的包。
__init__.py有两个主要原因
为了方便:其他用户不需要知道您的函数在包层次结构(文档)中的确切位置。您的程序包(_P)/__初始__.py文件1.py文件2.py...文件N.py#在__init__.py中从.file1导入*从.file2导入*...从.fileN导入*#在file1.py中def add():通过然后其他人可以调用add()从您的_package导入添加不知道file1的内部函数,例如从您的_package.file1导入添加如果你想初始化一些东西;例如,日志记录(应该放在顶层):导入logging.configlogging.config.dictConfig(Your_logging_config)
__init__.py:它是一个在包目录中找到的Python文件,在导入包或包中的模块时调用。您可以使用它来执行包初始化代码,即每当导入包时,在执行此文件夹中的其他模块之前,首先执行python语句。它类似于c或Java程序的主函数,但它存在于Python包模块(文件夹)中,而不是核心Python文件中。它还可以访问__init__.py文件中定义的全局变量,就像将模块导入Python文件一样。
例如。我在一个名为pymodlib的文件夹中有一个__init__.py文件,该文件包含以下语句:
print(f'Invoking __init__.py for {__name__}')
pystructures = ['for_loop', 'while__loop', 'ifCondition']
当我在解决方案模块、笔记本或python控制台中导入此包pymodlib时:这两条语句在导入时执行。因此,在日志或控制台中,您将看到以下输出:
>>> import pymodlib
Invoking __init__.py for pymodlib
在python控制台的下一条语句中:我可以访问全局变量:
>> pymodlib.pystructures
它给出以下输出:
['for_loop', 'while__loop', 'ifCondition']
现在,从Python3.3开始,可以选择使用该文件来使文件夹成为Python模块。因此,您可以跳过将其包含在python模块文件夹中。
它有助于导入其他python文件。当您将此文件放置在包含其他py文件的目录(比如stuff)中时,可以执行类似importstuff.other的操作。
root\
stuff\
other.py
morestuff\
another.py
如果在目录中没有这个__init__.py,您就无法导入other.py,因为Python不知道这些东西的源代码在哪里,也无法将其识别为一个包。
推荐文章
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- 蟒蛇导出环境文件
- Django - makemigrations -未检测到任何更改
- SQLAlchemy:引擎、连接和会话差异
- 在Python Pandas中删除多个列中的所有重复行
- 更改pandas DataFrame中的特定列名
- 将Pandas多索引转换为列
- 熊猫在每组中获得最高的n个记录
- 熊猫数据帧得到每组的第一行