在python 3中将字符串与其他iterables分开

时间:2012-11-04 03:43:37

标签: python python-3.x python-3.3

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

1 个答案:

答案 0 :(得分:3)

你已经看到了基于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))

之类的事情