我正在尝试确定函数参数是字符串还是其他可迭代对象。具体来说,这用于构建 URL 参数,试图模拟 PHP 的数组 ¶m[]=val
语法 - 所以鸭子类型在这里并没有真正的帮助,我可以迭代一个字符串并生成像 ¶m[]=v¶m[]=a¶m[]=l
这样的东西,但这显然不是我们想要的。如果参数值是一个字符串(或者一个字节?我仍然不知道一个字节实际上是什么),它应该产生 ¶m=val
,但是如果参数值是(对于例如)一个列表,每个元素应该接收自己的 ¶m[]=val
。我已经看到很多关于如何在 2.* 中执行此操作的解释,涉及 isinstance(foo, basestring)
,但 basestring
在 3.* 中不存在,我还读到 isinstance(foo, str)
会错过更复杂的字符串(我认为是 unicode?)。那么,在不导致某些类型因不必要的错误而丢失的情况下执行此操作的最佳方法是什么?
最佳答案
您已经看到基于 Python 2 和 3 的一些冲突。在 Python 3 中,isinstance(foo, str)
几乎肯定是您想要的。 bytes
用于原始二进制数据,您可能无法将其包含在这样的参数字符串中。
python 2 str
类型存储原始二进制数据,通常是某种特定编码的字符串,如 utf8 或 latin-1 等; unicode
类型存储了更“抽象”的字符表示,然后可以将其编码为任何特定的编码。 basestring
是它们的共同祖先,因此您可以轻松地说“任何类型的字符串”。
在 python 3 中,str
是更“抽象”的类型,bytes
用于原始二进制数据(例如特定编码中的字符串,或任何原始二进制数据)您要处理的数据)。您不应该将 bytes
用于任何本来是字符串的内容,因此没有真正的理由检查它是 str
还是 bytes
。不过,如果您绝对需要,您可以执行类似 isinstance(foo, (str, bytes))
的操作。
关于python - 将字符串与 python 3 中的其他可迭代对象分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215873/