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 的代码中。将您想要 运行 的功能递归到一个单独的函数中,问题应该就会消失。
我已经在 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 的代码中。将您想要 运行 的功能递归到一个单独的函数中,问题应该就会消失。