Python 3.x Python导入差异

Python 3.x Python导入差异,python-3.x,python-3.6,Python 3.x,Python 3.6,在Python中,它看起来像自定义类,在导入时需要完全分类 比如说, from analytics.npv_differences import NpvDifferences 分析 --npv_differences.py包含npvddifferences类 以下情况不起作用时: from analytics import NpvDifferences 然而,对于大熊猫来说,以下两项工作 from pandas import DataFrame from pandas.core.frame

在Python中,它看起来像自定义类,在导入时需要完全分类

比如说,

from analytics.npv_differences import NpvDifferences
分析 --npv_differences.py包含npvddifferences类

以下情况不起作用时:

from analytics import NpvDifferences
然而,对于大熊猫来说,以下两项工作

from pandas import DataFrame
from pandas.core.frame import DataFrame
为什么不同?

有什么不同? 差异是由一个_uinit__uu.py文件造成的

它是一个将包含Python代码的目录转换为Python包的文件。这是包裹上的标签

py包含导入包时运行的代码。 这包括:

导入模块 导入模块。子模块 从模块导入一些东西 从module.submodule导入一些东西 在所有这些情况下,都会执行module/\uuuu init\uuuuu.py。您可以通过在文件中添加print调用并在导入期间观察输出来测试这一点

它可以是空的,但大多数情况下,它从子目录导入,以允许简短的导入表单。这是熊猫来源的文件。如果您快速查看,您将看到有来自子包的导入

如何做到这一点? 如果您在目录analytics中创建一个_init__u;.py文件并在那里导入类,您将能够像pandas一样使用短导入

您的analytics/\uuuuu init\uuuuuu.py文件应该包含以下内容:

from analytics.npv_differences import NpvDifferences
导入的分析部分可以省略,将其转换为相对导入。如果将其放入_uinit__uuu.py中,将得到相同的结果:

from .npv_differences import NpvDifferences
相对导入更好,因为如果您碰巧将包重命名为其他名称,则导入不会中断

为什么会这样? 为什么在_init_uuuuuuuy.py内导入允许短导入,是因为在_init_uuuuuuuuuuy.py中定义的任何变量都可以在模块级别上使用

例如,如果module/\uuuuu init\uuuuuu.py包含以下代码:

from .submodule import SomeClass  # this defines a `SomeClass` variable
__doc__ = '''This behaviour is commonly used to define 
             module-level documentation, available with 
             a call `help(module)`.'''
config_var = 1337
然后,以下情况成为可能:

import module
help(module)  # will output the content of the __doc__ variable
module.SomeClass()  # create an instance of module.submodule.SomeClass
print(module.config_var)  # prints 1337

这就是为什么在pandas _init _; py.py中使用del小心地删除任何不必要的变量。确保不要污染模块级命名空间。

awesomeee。为什么在init文件中导入使导入可以通过短导入访问?您提到导入包时,将执行init。所以当我从那个包中导入任何类时,init被执行?此外,一旦执行了这些导入,原始文件就可以导入它们了吗?一旦init被执行,我就不知道它们在哪里了。@Crt我已经更新了帖子。我不太明白你的最后一个问题,谢谢!您似乎仍然将该类作为模块引用。SomeClass甚至认为它是在init中导入的。我认为它可以作为参考SomeClass@Crt如果您使用from module import SomeClass,那么访问SomeClass是可能的。是的,但是,我认为,因为您已经在init文件中导入了它,那么它可以作为SomeClass引用,而不是再次导入。