Dataframe class 如何直接从 pandas 包导入

how Dataframe class is imported directly from pandas package

在pandas中我们可以直接做下面的事情

import pandas as pd

df = pd.DataFrame()

这里,pandas是一个包。 DataFrame 是一个 class。那么,这是如何工作的,因为 DataFrame 实际上是在 pandas.core.frame 中定义的(它是在 pandas 的核心文件夹内的 frame.py 中定义的。)

注意:我在想这种行为可以通过在 __init__.py 文件中做一些事情来实现。谁能帮我理解一下。

你说的

Dataframe定义在pandas/core/frame.py.

让我们来看看github上的pandas/__init__.py in pandas directory

第 42 行:

from pandas.core.api import *

并且 pandas/core/api.py 在第 23 行从 pandas/core/frame.py 导入 Dataframe

from pandas.core.frame import DataFrame

所以既然你 import *pandas/core/api.pypandas/__init__.pypandas/core/api.py 进口 Dataframe 那么你有 Dataframe 直接进口到 pandas.

__init__.py 在技术上只是另一个 python 模块,因此在包的 __init__.py 中定义的任何名称都可以直接从包本身访问。在 Python 中,将包的 __init__.py 用作 a facade for submodules / subpackages 确实是一种常见的模式。

FWIW 请注意,panda 的 __init__.py 虽然是使用 __init__.py 作为门面的示例,但未遵循良好做法,因为它使用 "star imports" (from submodule import *)这使得追踪名称的来源(定义它的模块)变得非常痛苦 - 特别是对于像 Panda 这样的大包 - and 也非常脆弱,因为如果两个子模块导出最后导入的同名将覆盖第一个。好的做法是始终明确指定要导入的名称:

from submodule1 import foo, bar
from submodule2 import baaz, quux

这可以清楚地说明名称的来源,并使重复的名称更加明显:

from submodule1 import foo, bar
from submodule2 import baaz, quux
from submodule3 import foo # oops, we will have to rename either this one or submodule1.foo