python - 将字符串与 python 3 中的其他可迭代对象分开

标签 python python-3.x python-3.3

我正在尝试确定函数参数是字符串还是其他可迭代对象。具体来说,这用于构建 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/

相关文章:

python - "a type/class/function/module/... object"的含义?

python-3.x - 有人可以解释 matplotlib.patches.arc 中的不同参数吗?

python - PyQt windows - 根本无法加载任何sql驱动程序

python - 如何接收带有空数据的套接字消息?

python - 使用 python 在 Windows 中更改鼠标指针速度

从 MS Access 导入 Python : "Invalid connection string attribute"

python - Matplotlib basemap 动画

python - 类中的嵌套列表

python - ctypes Python动态函数调用

python 3 : ImportError "No Module named Setuptools"