[pandas DataFrame在猴子修补其构造函数时位于” limbo”中

问题描述 投票:1回答:1

我正在尝试猴子修补pandas中的DataFrame构造函数。内部范围(位于补丁内部)的返回值消失了-返回None。但是,在外部范围内,即使补丁返回显然是None

,也可以按预期构造DataFrame
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个回答
0
投票

在python中,__init__通常不返回obj。它不会创建对象。对象已由__new__创建。调用__init__时,假定对象已经存在。

__init__目的是初始化Objects属性,因此没有理由从中返回任何内容。只需拉出任何python源代码,您几乎就不会在return]中看到任何__init__命令

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

© www.soinside.com 2019 - 2024. All rights reserved.