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