python - 创建一个保存方法输入的装饰器 - 返回 'NoneType' 对象不可调用

标签 python decorator python-decorators

我目前使用的是无服务器解决方案(ML 引擎),我需要不时将流程的数据帧保存在云存储中。为此,我创建了名为 save_current_data_frame_to_track 的方法,我想将其转换为装饰器,如下所示:

import numpy as np
import pandas as pd

def save_current_data_frame_to_track(current_data_frame, filename):
    current_data_frame.to_csv(filename + '.csv')
    pass

def save_input_to_track(func):
    def func_wrapper(*args, func):
        for arg in args:
            for key, value in locals():
                if type(value) == 'pandas.core.frame.DataFrame':
                    save_current_data_frame_to_track( value, key)
            return (func)
        return func_wrapper

rp = pd.DataFrame(data={'time_delta_from': [60, 90, 170],
                                'time_delta_to': [30, 60, 120]},
                        index=[1, 2, 3], dtype=np.int32)

@save_input_to_track
def add_1(data):
    data['time_delta_from'] = 1
    return data

add_1(rp)

这给了我以下错误:

 add_1(rp)
TypeError: 'NoneType' object is not callable

为什么会出现这个错误?

最佳答案

我建议您使用 wraps , 阅读有关如何获取包装函数参数的详细信息 here .看起来你的代码应该是:

import numpy as np
import pandas as pd
from functools import wraps

def save_current_data_frame_to_track(current_data_frame, filename):
    current_data_frame.to_csv(filename + '.csv')

def save_input_to_track(func):
    @wraps(func)
    def func_wrapper(*args, **kwargs):
        for arg in args:
            if isinstance(arg, pd.core.frame.DataFrame):
                save_current_data_frame_to_track(arg, 'somefile')
        return func(*args)
    return func_wrapper

rp = pd.DataFrame(data={'time_delta_from': [60, 90, 170],
                        'time_delta_to': [30, 60, 120]},
                  index=[1, 2, 3], dtype=np.int32)

@save_input_to_track
def add_1(data):
    data['time_delta_from'] = 1
    return data

add_1(rp)

对于键名作为文件名,我认为简单的解决方案是使用 kwarg,这里是示例:

import numpy as np
import pandas as pd
from functools import wraps

def save_current_data_frame_to_track(current_data_frame, filename):
    current_data_frame.to_csv(filename + '.csv')

def save_input_to_track(func):
    @wraps(func)
    def func_wrapper(*args, **kwargs):
        for key, kwarg in kwargs.items():
            if isinstance(kwarg, pd.core.frame.DataFrame):
                save_current_data_frame_to_track(kwarg, key)
        return func(*args, **kwargs)
    return func_wrapper

rp = pd.DataFrame(data={'time_delta_from': [60, 90, 170],
                        'time_delta_to': [30, 60, 120]},
                  index=[1, 2, 3], dtype=np.int32)

@save_input_to_track
def add_1(data1, data2):
    data1['time_delta_from'] = 1
    data2['time_delta_from'] = 2
    return data1, data2

add_1(data1=rp, data2=rp)

关于python - 创建一个保存方法输入的装饰器 - 返回 'NoneType' 对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54924342/

相关文章:

python - 在 __init__() 上调用修饰类方法

python - 计算字符串中的连续数字

python - 带有来自终端的参数的 bash 程序

clojure - 如何覆盖现有对象的方法?

python - 使用 python 装饰器自动替换函数参数默认值?

python - 是否可以 numpy.vectorize 一个实例方法?

python - 通过链接装饰器使用 Flask-HTTPAuth 创建特权用户 --- 丢失上下文?

python - Tensorflow 中的可变范围问题

python - 与 os.rename() 函数作斗争

python - 基于云的内存