我正在尝试确定函数参数是字符串还是其他可迭代的。具体来说,这用于构建 URL 参数,以尝试模拟 PHP 的¶m[]=val
数组语法 - 所以鸭式输入在这里并没有真正的帮助,我可以遍历字符串并生成类似的东西¶m[]=v¶m[]=a¶m[]=l
,但这显然不是我们想要的。如果参数值是一个字符串(或一个字节?我仍然不知道一个字节的实际意义是什么),它应该产生¶m=val
,但是如果参数值是(例如)一个列表,每个元素都应该接收它的拥有¶m[]=val
. 我在 2.* 中看到了很多关于如何做到这一点的解释isinstance(foo, basestring)
,但basestring
在 3.* 中不存在,我也读过isinstance(foo, str)
会错过更复杂的字符串(我认为是 unicode?)。那么,在不导致某些类型因不必要的错误而丢失的情况下,最好的方法是什么?
问问题
94 次
1 回答
3
您已经看到基于 Python 2 与 3 的一些冲突。在 Python 3 中,isinstance(foo, str)
几乎可以肯定是您想要的。bytes
用于原始二进制数据,您可能无法将其包含在这样的参数字符串中。
python 2str
类型存储原始二进制数据,通常是某种特定编码的字符串,如 utf8 或 latin-1 之类的;该unicode
类型存储了字符的更“抽象”表示,然后可以将其编码为任何特定的编码。basestring
是他们俩的共同祖先,因此您可以轻松地说“任何类型的字符串”。
在 python 3 中,str
是更“抽象”的类型,bytes
用于原始二进制数据(如特定编码中的字符串,或您想要处理的任何原始二进制数据)。你不应该使用bytes
任何本来是字符串的东西,所以没有真正的理由检查它是否是str
or bytes
。但是,如果您绝对需要,您可以执行类似isinstance(foo, (str, bytes))
.
于 2012-11-04T03:49:56.797 回答