Chalice 框架中 Python 递归函数的奇怪问题

Strange issue with Python recursive function in Chalice framework

我已经在 Chalice 中定义了这个 SNS 触发的 Lambda:

@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 背后的魔法有关,但我不确定下一步要看哪里。

问题是函数被装饰了,失败在装饰器是 运行ning 的代码中。将您想要 运行 的功能递归到一个单独的函数中,问题应该就会消失。