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
我正在尝试在 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