Метод класса оборачивает функцию - Проблемы с аргументами - PullRequest
0 голосов
/ 01 февраля 2020

В моем основном у меня есть функция с ошибкой и класс, который отслеживает ошибки в списке внутри самого класса. Другими словами, вместо того, чтобы просто вызывать функцию, я хотел бы передать эту функцию методу класса, который затем «регистрирует» ошибку в списке и подавляет ее.

Вот моя проблема:
Эта функция имеет входные аргументы. Когда я передаю свою функцию методу класса, я бы тоже хотел передать входные данные. Что происходит, так это то, что функция выполняется до перехода к методу класса. Следовательно, метод класса не может подавить ошибку, которая происходит в функции.

В приведенном ниже коде я установил переменную silent=True, поэтому она не должна вызывать ошибку (из-за предложения try / исключением внутри метода). К сожалению, код вызывает ошибку TypeError, которая исходит из функции.

Любой совет будет высоко ценится

PS: я не ищу решения для декоратора:)

Вот класс с методом класса которая может подавить ошибку

class ErrorTracker:
    def __init__(self):
        self.list = list()

    def track_func(self, func, silent=False):
        try:
            self.list.append('...in trying')
            print('....trying.....')
            return func
        except Exception as e:
            self.list.append('...in except')
            self.list.append(e)  # important line - here the error gets "logged"
            if not silent:
                raise e

Вот функция с ошибкой

def transformation_with_error(app1, app2):
    # DO STUFF HERE with inputs
    result = str(app1)+str(app2)
    print(result)
    print('TYPE ERROR here')
    raise TypeError
    return result

Здесь основная процедура :

if __name__ == "__main__":
    error_tracker = ErrorTracker()

    print('-- start transformation')
    error_tracker.track_func(transformation_with_error(app1='AA', app2='BB'), silent=True)
    print('-- end transformation')

    print(error_tracker.list)

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Если я понимаю вашу проблему, в вашей основной процедуре

error_tracker.track_func(transformation_with_error(app1='AA', app2='BB'), silent=True)

вызывает transformation_with_error перед вводом error_tracker.track_func. Это происходит только потому, что вы действительно звоните transformation_with_error. Если вы хотите, чтобы ваш error_tracker.track_func вызывал transformation_with_error, вы должны передать позже в качестве аргумента, как вы бы сделали для обратного вызова.

Например:

def test(var1, var2):
    print("{} {}".format(var1, var2))

def callFn(func, *vars):
    func(*vars)

callFn(test, "foo", "bar")

output foo bar

0 голосов
/ 01 февраля 2020

Thx VincentRG
Вот и все
Только для записи, ниже приведены изменения, которые я сделал:
(примечание: я также добавил ** kwargs, чтобы иметь возможность работать со значениями по умолчанию) )

thx mate

изменения класса

class ErrorTracker:
    def __init__(self):
        self.list = list()

    def track_func(self, func, silent=False, *args, **kwargs):
        try:
            self.list.append('...in trying')
            print('....trying.....')
            return func(*args, **kwargs)
        except Exception as e:
            self.list.append('...in except')
            self.list.append(e)   # important line - here the error gets "logged"
            if not silent:
                raise e

изменение вызова

if __name__ == "__main__":
    error_tracker = ErrorTracker()

    print('-- start transformation')
    error_tracker.track_func(transformation_with_error, silent=True, app1='AA', app2='BB')
    print('-- end transformation')

    print(error_tracker.list)
...