TypeError:从附加项提取时,类型为“NoneType”的参数不可iterable

2024-09-29 19:36:42 发布

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

  • 我试图从字典中提取一个值

  • 如果value不在parames键中,我将传递一个默认值

  • 我得到了TypeError: argument of type 'NoneType'

下面是字典

event = {
  'resource': '/test',
  'path': '/test',
  'httpMethod': 'GET',
  'headers': None,
  'multiValueHeaders': None,
  'query': None,
  'parames': None,
  'path': None,
  'Variables': None}

我的代码在下面

if 'value' in event['parames']:
    if isinstance('value', int)
        val = int(event['parames']['value'][0])
    else:
        val = 10
else:
    val = 10
print(val)

我的想法

  • 检查value是否存在于event

  • 如果存在,则提取value

  • 在异常情况下,我将得到值=10


Tags: ofpathtestnoneeventif字典value
3条回答
  1. 当您执行in event['parames']时,Python会尝试对其进行迭代。在您的示例中event['parames']是None

  2. 在代码中'value'是一个字符串,因为它周围有引号,所以它永远不会输入if,因为isinstance将失败。我知道你想要一个键“值”,看看是否有内容?但是:您访问了event['parames']['value'][0],因此iInstance仍然会失败

  3. “如果参数键中没有值,我将传递一个默认值”-这听起来像是dict.get的位置

Python喜欢“请求原谅比请求许可更好”,因此chepner的代码更短更清晰,但如果您想手动执行操作:

tmp = (event['parames'] or {}).get('value')

使用or的技巧,我们将获得参数或-如果参数为None-空dict。因此,我们修复了(1)

然后我们使用.get,正如我在(3)中建议的那样。它基本上在dict中查找给定的键(这就是为什么我们需要failsafe empty dict),如果找不到它,它将返回一个默认值(第二个参数,如果没有给定,则返回None)

所以现在我们的tmp要么是有值的内容,要么是无值的内容

如果值在存在时始终是列表/iterable,则只要检查它,我们就可以执行以下操作:

if tmp:
   ...

这将检查下面的bool(tmp)-这仅对于直观上为空的内容是错误的-无,0,空的iterables/字符串(len(something)==0)

既然我们假设tmp始终是一个iterable,现在我们知道它不是None,它的长度也不是0,那么我们就可以得到[0]

但它留下了int元素。但是我们可以使用str.isnumeric检查字符串中的数值。但这也假设我们在里面有一个字符串,而不是其他可以使用的东西

因此,完整代码:

tmp = (event['parames'] or {}).get('value')
if tmp and tmp[0].isnumeric():
    val = int(tmp[0])
else:
    val = 10

(如果使用Python3.8+,可以使用walrus操作符在If中声明tmp。)

所以。。。就这样。但正如你们所看到的,关于参数和值是什么,我们有多种假设。这就是为什么chepner的代码更好——它不做任何假设。但由于您似乎正在学习,我决定发布更长的代码来解释每个问题

你可能想要

try:
    val = int(event['parames']['value'][0])
except (TypeError, LookupError, ValueError):
    val = 10

如果以下任一项为真,则将val设置为10

  1. event['parames']引起KeyError
  2. event['parames']['value']引起KeyErrorTypeError
  3. event['parames']['value'][0])引发TypeErrorKeyErrorIndexError
  4. int(event['parames']['value'][0])引发一个ValueError

我还有一个解决办法。如果有帮助的话

if event.get('parames', False) != False:
    if isinstance('value',int):
        val = 10
else:
    val = 5
print(val) 

相关问题 更多 >

    热门问题