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.py
在 pandas/__init__.py
和 pandas/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
在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.py
在 pandas/__init__.py
和 pandas/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