Метод Python, чтобы попробовать другой произвольный метод, пока он не запустится без ошибок? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать метод для запуска произвольного метода, переданного ему до тех пор, пока он не будет выполнен без ошибок.

    def multiTry(method, sArg, **kwargs):
        """
        Attempt a specified method until it runs without error.
        Inputs:
          method:  method to be tried until it runs without error
          sArg:  string of all arguments to be passed to method
          kwargs:  all arguments needed for method
        """

        for key, value in kwargs.items():
            eval(key = value)

        bDone = False
        while not bDone:
            try:
                method(eval(sArg))
                bDone = True
            except:
                pass

    multiTry(method=methodToRun, sArg="myString, myNum", myString="hello", myNum=5)

Цель состоит в том, чтобы повторно попытаться:

methodToRun("hello", 5)

. .. пока он не запустится успешно, где methodToRun - любой метод, а аргументы - любые аргументы.

Я понимаю, что оба оператора eval используются неправильно. Возможно, существует совершенно другой способ достижения той же цели? У меня есть несколько методов для индивидуального запуска до успешного завершения, и я не хотел бы помещать каждый из них в встроенные блоки try-кроме.

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Не нужно изобретать велосипед здесь, это довольно распространенное требование, я рекомендую вам использовать библиотеку цепкости https://tenacity.readthedocs.io/en/latest/ множество опций для обработки повторов с хорошим интерфейсом. Это вилка старой повторной библиотеки: https://pypi.org/project/retrying/

2 голосов
/ 10 октября 2019

Ты довольно близко. Что-то вроде этого должно делать то, что вам нужно:

def multiTry(method, **kwargs):
    while(1):
        try:
            method(**kwargs)
            return
        except:
            pass

multiTry(method=methodToRun, myString="hello", myNum=5)
...