不需要的自动类型转换

Unwanted automatic type conversion

以下代码

"""
Gets the error cause from a pipeline execution status.

:param execution_status: is the pipeline execution status.
:type execution_status: dictionary.
:returns: the pipeline execution error cause and the name of the step.
:rtype: dictionary.
"""
def get_error_cause(execution_status):
  error_cause = "Unknown"
  error_step = "Unknown"
  steps = execution_status['Steps']
  if steps:
    for step in steps:
      if 'FailureReason' in step:
        print(str(type(step['Name'])))
        error_step = step['Name'],
        print(str(type(error_step)))
        error_cause = step['FailureReason']
        break
  else:
    error_cause = execution_status['FailureReason']
  return {
    'Step': error_step,
    'Cause': error_cause
  }

AWS Lambda 环境 中执行时,会自动将 str 转换为元组。代码中出现的两个“打印”方法的输出如下:

<class 'str'>

<class 'tuple'>

这导致在将方法返回的字典序列化为 JSON 时,不是将 'Step' 键的值序列化为字符串,而是序列化为列表:

{
  "Step": ["ConcatenateColumns"],
  "Cause": "AccessDenied"
}

方法的输入是一个JSON反序列化成字典,像这样:

{
    "ExecutionID": "some_execution_ID",
    "Status": "Failed",
    "ElapsedMinutes": 13.0,
    "Steps": [{
        "Name": "ConcatenateColumns",
        "Status": "Failed",
        "ElapsedMinutes": 13.0,
        "FailureReason": "AccessDenied"
    }],
    "FailureReason": "Step failure: One or multiple steps failed."
}

这不是自动类型转换,您将 error_step 定义为元组。 去掉行尾的逗号:

error_step = step['Name']

请参阅 python 文档:https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences