【问题标题】:pandas DataFrame lives in "limbo" when monkey patching its constructor当猴子修补其构造函数时,pandas DataFrame 处于“边缘”状态
【发布时间】:2025-12-13 06:15:01
【问题描述】:

我正在尝试修改 pandas 中的 DataFrame 构造函数。内部作用域(补丁内)的返回值消失了 - 它返回 None。然而,在外部范围内,DataFrame 是按预期构建的,即使补丁返回是明显的None

import pandas as pd

f = pd.DataFrame.__init__


def make_df(*args, **kwargs):
    print('Called Before')
    df = f(*args, **kwargs)
    print(f"df from inner scope:\n{df}")
    return df


pd.DataFrame.__init__ = make_df

df = pd.DataFrame({'a': list('aab'), 'b': [1, 2, 3]})
print()
print(f'df from outer scope:\n{df}')

结果:

Called Before
df from inner scope:
None

df from outer scope:
   a  b
0  a  1
1  a  2
2  b  3

这是什么原因?

【问题讨论】:

    标签: python pandas dataframe monkeypatching


    【解决方案1】:

    在 python 中,__init__ 通常不返回 obj。它不创建对象。对象已由 __new__ 创建。当您调用__init__ 时,对象应该已经存在。

    __init__ 目的是初始化 Objects 属性,因此没有理由从中返回任何内容。只要拉出任何python源代码,你很少会在__init__看到任何return命令

    在你的猴子补丁__init__ (makedf) 中,你的df 捕获原始pd.DataFrame.__init__return,它没有return。所以是None

    【讨论】:

    • 哦!是的,我现在看到了。所以它甚至不是熊猫特有的。只是被熊猫的长 init 弄糊涂了
    • 是的,它与熊猫无关。这是python设计:)