<p>你写道:</p>
<pre><code>isinstance(
(int(data.GetParam(1).lower())),
int
)
</code></pre>
<p>这个片段有两个问题:</p>
<ul>
<li>调用<code>int(..)</code>构造函数,如果提供非整数(如<code>"foobar18"</code>),则<strong>可能会失败(错误);并且</li>
<li>如果构造函数成功了,那么就可以保证结果是<code>int</code>,因此<strong>检查是无用的。你知道吗</li>
</ul>
<p>所以现在的问题是怎么做。我们可以构造一个高级检查来检查字符串是否确实是整数,但问题是我们必须覆盖多个情况,而且很容易忘记一个。你知道吗</p>
<p>Python语言的思想是:<strong>EAFP</strong>:<strong>E</strong>比<strong>a</strong>sk更适合<strong>F</strong>而不是<strong>p</strong>终止。这意味着Python的哲学是鼓励尝试某些东西,在特殊情况下,处理它,而不是首先检查某个东西是否是整数。你知道吗</p>
<p>所以文可以这样写:</p>
<pre><code>if data.IsChatMessage():
<b>try:</b>
int(data.GetParam(1).lower()) # we try it
<b>isint</b> = True # it worked!
<b>except ValueError:</b>
# that did not worked out very well, did it?
<b>isint</b> = False
if (data.GetParam(0).lower() == settings["command"]
and <b>isint</b>
and settings["costs"] <= Parent.GetPoints(data.User):
pass</code></pre>
<p>您最好总是指定您希望看到的错误(<code>ValueError</code>),因为例如,如果<code>data.GetParam(1)</code>引发另一个错误,您本身并不希望在那里处理它:这并不意味着<code>data.GetParam(1).lower()</code>不是整数,而是意味着<code>data.GetParam(1)</code>产生了一些(其他)错误。你知道吗</p>