pandas 当猴子修补其构造函数时,DataFrame 存在于 "limbo"

pandas DataFrame lives in "limbo" when monkey patching its constructor

我正在尝试在 pandas 中修改 DataFrame 构造函数。内部作用域(补丁内)的 return 值消失了 - 它 return 与 None 相关联。然而,在外部范围内,DataFrame 是按预期构造的,即使补丁 return 是明显的 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中,__init__通常不会return obj。它不创建对象。 __new__ 已创建对象。当您调用 __init__ 时,对象应该已经存在。

__init__ 目的是初始化对象属性,因此没有理由 return 从中得到任何东西。只需拉出任何 python 源代码,您很少会在 __init__

中看到任何 return 命令

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