【问题标题】:Separate strings from other iterables in python 3在python 3中将字符串与其他可迭代对象分开
【发布时间】:2012-11-04 03:43:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您已经看到基于 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)) 之类的操作。

    【讨论】:

    • 我会反过来争论。要在网络上传递数据,您需要在某个时候对其进行编码(创建bytes)。因此,从bytes 片段构造一个 URL 是非常有意义的。
    • 是的,这是真的 - 但查询字符串应该是纯 ascii 和 % 编码的,对吧?因此,大多数 API 您可能希望传递 URL 编码的字符串(可能是 str)或稍后将进行 URL 编码的通用字符串(也是 str)。
    • 问题是,如果它已经被 urlencoded(因此是纯 ASCII)它也可能是bytes。事实上,这可能是更明智的选择,因为如果后来有人尝试添加另一个字符串而不先对其进行 urlencoding,则会导致错误。
    • 在 python 3 中,我认为在 bytes 的库中传递 URL 编码的 ASCII 字符串非常奇怪。
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 2022-01-13
    • 2018-06-21
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多