Создайте декоратор, который сохраняет методы ввода - возвращает объект 'NoneType', который не вызывается - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время я использую решение без сервера (ML -engine), и мне нужно время от времени сохранять кадры данных процесса в облачном хранилище.Для этого я создал метод с именем 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

Почемуя получаю эту ошибку?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я рекомендую вам использовать обертки , подробности о том, как получить параметры обернутой функции здесь .И похоже, что ваш код должен быть:

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)
0 голосов
/ 12 марта 2019

Произошла проблема с отступом в вашем коде.Также неверно то, как вы возвращаете func.Следующий код должен работать для вас:

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):
        for arg in args:
           if type(value) == 'pandas.core.frame.DataFrame':
               save_current_data_frame_to_track( value, 'some_file')
        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)
...