我正在尝试猴子修补pandas
中的DataFrame构造函数。内部范围(位于补丁内部)的返回值消失了-返回None
。但是,在外部范围内,即使补丁返回显然是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__
通常不返回obj。它不会创建对象。对象已由__new__
创建。调用__init__
时,假定对象已经存在。
__init__
目的是初始化Objects属性,因此没有理由从中返回任何内容。只需拉出任何python源代码,您几乎就不会在return
]中看到任何__init__
命令
在您的__init__
猴子补丁(makedf)中,您的df
捕获了没有return
的原始pd.DataFrame.__init__
的return
。因此,它是None