从模块导入类到当前命名空间使该类看起来像子包中的模块

问题描述 投票:0回答:1

我正在使用 Python 和 PySpark。我按照此页面在 Windows 上的 Anaconda 中安装 PySpark 进行操作。我尝试获取有关

DataFrame
类及其
toDF
方法的在线帮助。从这个解释来看,所需的导入(以及后续的帮助命令)是:

from pyspark.sql import DataFrame # User import command
help(DataFrame)
help(DataFrame.toDF)

代码可以工作,但我不明白为什么,即使在广泛阅读了包、模块和初始化之后(例如,hereherehere)。

DataFrame
类定义在包
pyspark
、子包
sql
、模块文件
dataframe.py
中。文件
pyspark/sql/__init__.py
包含初始化

# __init__.py import command
from pyspark.sql.dataframe import DataFrame, DataFrameNaFunctions, DataFrameStatFunctions

我看到这个

__init__.py import command
如何将
DataFrame
类放入当前命名空间中。然而,为了使顶部的
User import command
运行,
DataFrame
必须像
pyspark.sql
子包中的模块一样出现。我不明白
__init__.py import command
是如何实现这一点的。

有人可以解释一下,指出我引用的资源之一中的关键段落,和/或向我推荐其他信息吗?

python python-import python-module
1个回答
0
投票

我相信答案已给出 这里: “当导入常规包时,这 __init__.py 文件被隐式执行,并且 它定义的对象绑定到中的名称 包的命名空间”。所以如果

pyspark/sq/__init__.py
包含:

from pyspark.sql.dataframe import DataFrame, etc.

那么

DataFrame
是存在于
pyspark.sql
命名空间。因此它变得完美 感觉从那里导入它通过

from pyspark.sql import DataFrame

假设以上是从 REPL 发出的, 这会将

DataFrame
放入 回复。

与我在问题中所说的相反,

__init__.py
将 DataFrame 导入到 “当前”命名空间(REPL 命名空间中 此处的场景)。这是一个错误,我 想到删除问题。然而,其他 新手也可能会误以为
__init__.py
文件(甚至导入的模块
*.py
文件)在“当前”上下文中运行 命名空间,类似于从 外壳。

我的问题还说:

from pyspark.sql import DataFrame

意味着

DataFrame
看起来像一个模块
pyspark.sql
子包中。读过一本 更多,我发现这不是真的。这
import
命令不仅导入 modules,而且 还有类,实际上是其中定义的任何对象 模块的
*.py
文件(参见 这里)。

© www.soinside.com 2019 - 2024. All rights reserved.