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