如何检查变量是否是python 2和3兼容性的字符串

Ran*_*unt 163 python string python-2.x python-3.x

我知道我可以使用:isinstance(x, str)在python-3.x中但是我需要检查python-2.x中是否有某个字符串.将isinstance(x, str)在python-2.x中按预期工作?或者我需要检查版本并使用isinstance(x, basestr)

具体来说,在python-2.x中:

>>>isinstance(u"test", str)
False
Run Code Online (Sandbox Code Playgroud)

和python-3.x没有 u"foo"

eca*_*mur 192

如果您正在编写兼容2.x和3.x的代码,则可能需要使用六个代码:

from six import string_types
isinstance(s, string_types)
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`future`包而不是`six`:`from future.utils import string_types` (3认同)
  • @Chandler.Huang 这个问题是关于在 Python 2 上识别“str”和“unicode”,或在 Python 3 上识别“str”。如果您不希望“unicode”依赖于 Python 2,只需使用“str”。 (2认同)

hbr*_*tow 108

我发现最简洁的方法,不依赖于六个包,是:

try:
  basestring
except NameError:
  basestring = str
Run Code Online (Sandbox Code Playgroud)

那么,假设你一直在以最通用的方式检查Python 2中的字符串,

isinstance(s, basestring)
Run Code Online (Sandbox Code Playgroud)

现在也适用于Python 3+.

  • 对于py3,来自`requests/compat.py`的`basestring =(str,bytes)` (10认同)
  • 我真的很喜欢这种方法. (2认同)
  • 为了同时满足 py2 &3 支持和 mypy,我最终得到了`if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)` (2认同)

Fil*_*Fil 32

这个怎么样,适用于所有情况?

isinstance(x, ("".__class__, u"".__class__))
Run Code Online (Sandbox Code Playgroud)

  • 我显然与作者独处,但我觉得这很优雅. (6认同)
  • 我也选择了这个选项,将它包装在辅助函数中,所以它只出现一次,文档字符串中有一个地方可以归功于Fil. (4认同)
  • 我喜欢这个答案的原因是它对于从python2迁移到3很友好。 (2认同)
  • 整洁,我一直在使用它,直到我意识到我也从__future__ import unicode_literals中激活了它。现在我要使用:`isinstance(val,(str,u“” .__ class __))` (2认同)

ste*_*eha 17

这是@Lev Levitsky的回答,重写了一下.

try:
    isinstance("", basestring)
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)
Run Code Online (Sandbox Code Playgroud)

try/ except测试只进行一次,然后定义总是工作,并尽可能快的功能.

编辑:实际上,我们甚至不需要打电话isinstance(); 我们只需要评估basestring,看看我们是否得到NameError:

try:
    basestring  # attempt to evaluate basestring
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)
Run Code Online (Sandbox Code Playgroud)

不过,我认为通过电话会更容易isinstance().

  • 我把它写成:`try:string_types = basestring除了NameError:string_types = str` (5认同)

tot*_*ico 10

future添加了(与Python 2)兼容的名称,因此您可以继续编写Python 3.您可以简单地执行以下操作:

from builtins import str
isinstance(x, str) 
Run Code Online (Sandbox Code Playgroud)

要安装它,只需执行即可pip install future.

作为一个警告,它只支持python>=2.6,>=3.3但它更现代six,只有使用时才推荐python 2.5

  • `从内置导入 str; isinstance('foo', str)` 在 python 2.7 中返回 False (2认同)

Lev*_*sky 8

也许使用类似的解决方法

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)
Run Code Online (Sandbox Code Playgroud)

  • 我建议一次执行`try` /`except`测试,并根据单个测试的结果,正确定义`isstr()`.每次调用`isstr()`都不需要产生异常开销. (2认同)

Mar*_*sen 6

您可以通过调用获取对象的类object.__class__,因此为了检查对象是否是默认的字符串类型:

    isinstance(object,"".__class__)
Run Code Online (Sandbox Code Playgroud)

并且您可以将以下内容放在代码的顶部,以便引号括起来的字符串在python 2中的unicode中:

    from __future__ import unicode_literals
Run Code Online (Sandbox Code Playgroud)