我试图从字典中提取一个值
如果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
当您执行
in event['parames']
时,Python会尝试对其进行迭代。在您的示例中event['parames']
是None在代码中
'value'
是一个字符串,因为它周围有引号,所以它永远不会输入if,因为isinstance
将失败。我知道你想要一个键“值”,看看是否有内容?但是:您访问了event['parames']['value'][0]
,因此iInstance仍然会失败“如果参数键中没有值,我将传递一个默认值”-这听起来像是
dict.get
的位置Python喜欢“请求原谅比请求许可更好”,因此chepner的代码更短更清晰,但如果您想手动执行操作:
使用
or
的技巧,我们将获得参数或-如果参数为None-空dict。因此,我们修复了(1)然后我们使用.get,正如我在(3)中建议的那样。它基本上在dict中查找给定的键(这就是为什么我们需要failsafe empty dict),如果找不到它,它将返回一个默认值(第二个参数,如果没有给定,则返回None)
所以现在我们的
tmp
要么是有值的内容,要么是无值的内容如果值在存在时始终是列表/iterable,则只要检查它,我们就可以执行以下操作:
这将检查下面的
bool(tmp)
-这仅对于直观上为空的内容是错误的-无,0,空的iterables/字符串(len(something)==0)既然我们假设
tmp
始终是一个iterable,现在我们知道它不是None,它的长度也不是0,那么我们就可以得到[0]但它留下了int元素。但是我们可以使用
str.isnumeric
检查字符串中的数值。但这也假设我们在里面有一个字符串,而不是其他可以使用的东西因此,完整代码:
(如果使用Python3.8+,可以使用walrus操作符在If中声明
tmp
。)所以。。。就这样。但正如你们所看到的,关于参数和值是什么,我们有多种假设。这就是为什么chepner的代码更好——它不做任何假设。但由于您似乎正在学习,我决定发布更长的代码来解释每个问题
你可能想要
如果以下任一项为真,则将
val
设置为10
:event['parames']
引起KeyError
event['parames']['value']
引起KeyError
或TypeError
event['parames']['value'][0])
引发TypeError
、KeyError
或IndexError
int(event['parames']['value'][0])
引发一个ValueError
李>我还有一个解决办法。如果有帮助的话
相关问题 更多 >
编程相关推荐