Странная проблема с рекурсивной функцией Python в фреймворке Chalice

#python-3.x #chalice

#python-3.x #чаша

Вопрос:

Я определил это лямбда-выражение, запускаемое SNS, в Chalice:

 @app.on_sns_message(topic='arn:aws:sns:us-west-1:XXXXXXXX:MyTopic')
def step1_photo_url_preload(event, retry = 3):
    try:
        js = json.loads(event.message)
        ... some logic here, event object is never modified ...        
    except:
        if retry:
            print("WARNING: failed, %d retries remaining" % retry)
            return step1_photo_url_preload(event, retry-1)
        else:
            raise
  

При возникновении исключения функция должна повторять попытку до 3 раз.

Вместо этого я получаю приведенное ниже исключение. Посмотрите внимательно на трассировку: строка 56 показывает, что ошибка возникает при попытке рекурсивного вызова:

 [ERROR] TypeError: 'SNSEvent' object is not subscriptable
Traceback (most recent call last):
  File "/var/task/chalice/app.py", line 1459, in __call__
    return self.func(event_obj)
  File "/var/task/app.py", line 56, in step1_photo_url_preload
    return step1_photo_url_preload(event, retry-1)
  File "/var/task/chalice/app.py", line 1458, in __call__
    event_obj = self.event_class(event, context)
  File "/var/task/chalice/app.py", line 1486, in __init__
    self._extract_attributes(event_dict)
  File "/var/task/chalice/app.py", line 1532, in _extract_attributes
    first_record = event_dict['Records'][0]
  

Загадочным образом функция не может работать с event объектом, который она получила в первый раз.

Что может вызвать это?

Я подозреваю, что это может иметь какое-то отношение к магии @app.on_sns_message , но я не уверен, где искать дальше.

Ответ №1:

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