pandas DataFrame живет в «подвешенном состоянии», когда обезьяна исправляет свой конструктор - PullRequest
2 голосов
/ 02 ноября 2019

Я пытаюсь обезопасить конструктор DataFrame в pandas. Возвращаемое значение из внутренней области видимости (внутри патча) исчезает - оно возвращается с 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

В чем причиназа что?

1 Ответ

0 голосов
/ 03 ноября 2019

В питоне __init__ обычно не возвращает obj. Это не создает объект. Объект уже создан __new__. Предполагается, что объект уже существует, когда вы звоните __init__.

__init__ puposes инициализирует атрибуты Objects, поэтому нет никаких причин возвращать что-либо из него. Просто откройте любой исходный код на Python, вы редко увидите любую команду return в __init__

внутри вашего патча обезьяны __init__ (makedf), а ваш df захватывает returnоригинал pd.DataFrame.__init__ который не имеет return. Следовательно, это None

...