Python类型错误在错误行上返回

2024-05-29 07:04:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定我遇到的问题是我缺乏使用Python的经验,还是解释器中的一个bug,但我想我得到了一条TypeError的消息。在

如果不是bug,请解释一下为什么会这样。我的代码如下:

#!/usr/bin/env python3

from awacs.aws import Policy, Principal, Statement
from troposphere import Template
from troposphere.iam import Role

t = Template()

t.add_resource(Role(
    "SESLambdaRole",
    AssumeRolePolicyDocument = Policy(
        Version = "2012-10-17",
        Statement = [
            Statement(
                Effect = "Allow",
                Resource = "arn:aws:logs:*:*:*",
                Principal = Principal(
                    "Service",
                    ["lambda.amazonaws.com"]
                    ),
                )
            ]
        )
    ))

print(t.to_json())

这是我的输出

^{pr2}$

如果我改变下面的行

Resource = "arn:aws:logs:*:*:*",

Resource = [ "arn:aws:logs:*:*:*" ],

它起作用了。为什么Python抱怨下面的第3行?在


Tags: fromimportawsprincipalpolicytemplate经验解释器
1条回答
网友
1楼 · 发布于 2024-05-29 07:04:27

Python不知道哪个实际参数出错了,只知道它是从一个跨越几行的表达式传递过来的。它粗略地猜测错误行(它as Ryan points out in the comments似乎是表达式中最后一个非标点符号行),并将错误报告为来自该行,但它可能来自出现错误的表达式的任何部分。更简单的例子是:

>>> i = int(
...         '#',
...         base=2
...        )
...
                                     -
ValueError                                Traceback (most recent call last)
<ipython-input-6-1e4a194d0c31> in <module>()
      1 i = int(
      2         '#',
  > 3         base=2
      4        )
      5

ValueError: invalid literal for int() with base 2: '#'

错误来自int构造函数(调用从第1行开始)、来自'#'参数(第2行),表达式在第4行结束,但箭头表示第3行。Python真正知道的是,错误来自int(...)表达式,它指出问题是表达式最后有意义的一行,但它并不真正知道哪个参数是错误的(引发异常的api不够细粒度,无法以编程的方式告诉Python哪个参数是问题所在,这可能会有所帮助),而且启发式也不起作用。在

您的代码也会发生同样的情况;Python知道Statement构造函数引发了异常,并且在引发错误时它会指向该表达式的最后一行,但它并不真正知道哪一行包含有问题的参数,而启发式方法给您提供了误导性的信息。幸运的是,异常消息告诉您出了什么问题(Resource参数必须是list),因此您可以使用该上下文扫描附近的行并注意非listResource参数。在

相关问题 更多 >

    热门问题