擅长:python、mysql、java
<p>如果需要,可以使用<code>isinstance</code>。它有点邪恶,因为它排除了自定义序列、迭代器和您可能实际需要的其他东西。但是,有时如果有人传递字符串,则需要采取不同的行为。我倾向于显式检查<code>str</code>或<code>unicode</code>,如下所示:</p>
<pre><code>import types
isinstance(var, types.StringTypes)
</code></pre>
<p>注意:不要把<code>types.StringType</code>误认为<code>types.StringTypes</code>。后者包含<code>str</code>和<code>unicode</code>对象。</p>
<p>许多人认为<code>types</code>模块已经过时,而只需直接检查对象的类型,因此如果您不想使用上面的模块,也可以显式检查<code>str</code>和<code>unicode</code>,如下所示:</p>
<pre><code>isinstance(var, (str, unicode)):
</code></pre>
<p><strong>编辑:</strong></p>
<p>更好的是:</p>
<pre><code>isinstance(var, basestring)
</code></pre>
<p><strong>结束编辑</strong></p>
<p>在这两种情况中的任何一种之后,您都可以回到行为上,就好像得到了一个正常的序列,让非序列引发适当的异常。</p>
<p>看到关于类型检查的“邪恶”之处,并不是您可能希望对某一类型的对象有不同的行为,而是您人为地限制您的函数对意外的对象类型执行正确的操作,否则将执行正确的操作。如果您有一个未进行类型检查的最终回退,则删除此限制。应该注意的是,过多的类型检查是一种代码味道,它表明您可能需要进行一些重构,但这并不一定意味着您应该从getgo中避免它。</p>