基于函数列表以编程方式在Python中修补多个函数

基于函数列表以编程方式在Python中修补多个函数,python,pandas,Python,Pandas,我尝试在如下函数列表上循环使用多个函数: from pandas import * class DataFrame(DataFrame): def new_function(self): print("I exist") patch_function = [read_csv, read_json, read_html, read_clipboard, read_excel, read_hdf, read_feather, rea

我尝试在如下函数列表上循环使用多个函数:

from pandas import *


class DataFrame(DataFrame):
    def new_function(self):
        print("I exist")


patch_function = [read_csv, read_json, read_html, read_clipboard, read_excel,
                  read_hdf, read_feather, read_parquet, read_msgpack,
                  read_stata, read_sas, read_pickle, read_sql, read_gbq]

for func in patch_function:
    orig_func = func

    def patch(*args, **kwargs):
        return DataFrame(orig_func(*args, **kwargs))

    func = patch

df = read_csv('example.csv')
df.new_function()

然而,这似乎不起作用。有人能告诉我为什么它不起作用以及如何做到这一点吗?谢谢大家!

我发现使用函数名的字符串列表更容易,而不是污染所有的pandas函数。我认为您的问题实际上是更新
pd
模块上的基本函数-希望这是有意义的,并且符合您的需要/期望

#patched_pandas.py

import pandas as pd

class DataFrame2(pd.DataFrame):
    def new_function(self):
        print("I exist")


patch_function = ['read_csv', 'read_json', 'read_html', 'read_clipboard', 'read_excel',
                  'read_hdf', 'read_feather', 'read_msgpack',
                  'read_stata', 'read_sas', 'read_pickle', 'read_sql']

for func in patch_function:
    orig_func = getattr(pd, func)

    def patch(func):
        def patched(*args, **kwargs):
            return DataFrame2(func(*args, **kwargs))
        return patched

    setattr(pd, func, patch(orig_func))
然后使用,只需导入和抓取熊猫的修改版本

#main.py (or wherever)
from patched_pandas import pd

df = pd.read_csv('example.csv')
df.new_function()

为了最大的方便,我玩了一会儿。我终于让它这样工作了(不知道为什么最后一行是必要的)


你想用这个做什么/为什么?示例中不清楚目标是什么。我想在熊猫中修补数据帧,但我不能。我被告知它是预编译的,不能在运行时进行修补。因此,我将使用DataFrama修补函数。但是,由于我将相同的补丁应用于许多函数,所以我希望在循环中执行此操作。另请参见我的初始问题:谢谢,想法很酷,但在修补之后,我想从另一个python脚本导入此python文件,并像导入熊猫一样工作。因此,基本上只需共享一个patched_pandas.py,然后将其导入为:import patched_pandas aspd@doom4我已经添加了一个编辑-让我知道如果工作。谢谢。我马上试试这个。太糟糕了,DataFrame被编译了,我们不能只设置TATTR(pd,DataFrame,DataFrame2),这对我不起作用。我总是得到:AttributeError:模块“patched_pandas”没有属性“read_csv”
#patched_pandas.py
from pandas import *

class DataFrame2(pandas.DataFrame):
    def new_function(self):
        print("I exist")


patch_function = ['read_csv', 'read_json', 'read_html', 'read_clipboard', 'read_excel',
                  'read_hdf', 'read_feather', 'read_msgpack',
                  'read_stata', 'read_sas', 'read_pickle', 'read_sql']

for func in patch_function:
    orig_func = getattr(pandas, func)

    def patch(func):
        def patched(*args, **kwargs):
            return DataFrame2(func(*args, **kwargs))
        return patched

    setattr(pandas, func, patch(orig_func))

from pandas import *
#main.py (or wherever)
import patched_pandas as pd

df = pd.read_csv('example.csv')
df.new_function()