1

我正在尝试确定函数参数是字符串还是其他可迭代的。具体来说,这用于构建 URL 参数,以尝试模拟 PHP 的&param[]=val数组语法 - 所以鸭式输入在这里并没有真正的帮助,我可以遍历字符串并生成类似的东西&param[]=v&param[]=a&param[]=l,但这显然不是我们想要的。如果参数值是一个字符串(或一个字节?我仍然不知道一个字节的实际意义是什么),它应该产生&param=val,但是如果参数值是(例如)一个列表,每个元素都应该接收它的拥有&param[]=val. 我在 2.* 中看到了很多关于如何做到这一点的解释isinstance(foo, basestring),但basestring在 3.* 中不存在,我也读过isinstance(foo, str)会错过更复杂的字符串(我认为是 unicode?)。那么,在不导致某些类型因不必要的错误而丢失的情况下,最好的方法是什么?

4

1 回答 1

3

您已经看到基于 Python 2 与 3 的一些冲突。在 Python 3 中,isinstance(foo, str)几乎可以肯定是您想要的。bytes用于原始二进制数据,您可能无法将其包含在这样的参数字符串中。

python 2str类型存储原始二进制数据,通常是某种特定编码的字符串,如 utf8 或 latin-1 之类的;该unicode类型存储了字符的更“抽象”表示,然后可以将其编码为任何特定的编码。basestring是他们俩的共同祖先,因此您可以轻松地说“任何类型的字符串”。

在 python 3 中,str是更“抽象”的类型,bytes用于原始二进制数据(如特定编码中的字符串,或您想要处理的任何原始二进制数据)。你不应该使用bytes任何本来是字符串的东西,所以没有真正的理由检查它是否是stror bytes。但是,如果您绝对需要,您可以执行类似isinstance(foo, (str, bytes)).

于 2012-11-04T03:49:56.797 回答