如何检查变量是否与 python2和3兼容字符串

我知道我可以在 python-3.x 中使用: isinstance(x, str),但是我需要检查 python-2.x 中是否也有字符串。isinstance(x, str)在 python-2.x 中是否能正常工作?或者我需要检查版本和使用 isinstance(x, basestr)

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

>>>isinstance(u"test", str)
False

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

102199 次浏览

也许可以用一个变通方法

def isstr(s):
try:
return isinstance(s, basestring)
except NameError:
return isinstance(s, str)

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

from six import string_types
isinstance(s, string_types)

这是列夫 · 列维茨基的回答,稍微改写了一下。

try:
isinstance("", basestring)
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)

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)

不过,我认为打电话给 isinstance()更容易理解。

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

    isinstance(object,"".__class__)

您可以将下面的代码放在代码的顶部,这样用引号括起来的字符串在 python 2中的 unicode 中:

    from __future__ import unicode_literals

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

try:
basestring
except NameError:
basestring = str

然后,假设您一直以最通用的方式检查 Python 2中的字符串,

isinstance(s, basestring)

现在也可以用于 Python3 + 。

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

isinstance(x, ("".__class__, u"".__class__))

Type (string) = = str

如果是字符串,返回 true; 如果不是,返回 false

future增加了(到 Python 2) 兼容的名字,所以你可以使用 继续编写 Python 3:

from builtins import str
isinstance(x, str)

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

作为一个 警告,它只支持 python>=2.6>=3.3,但它是更现代的 six,这是只有 建议如果使用 python 2.5

您可以在代码的开头尝试这样做:

from __future__ import print_function
import sys
if sys.version[0] == "2":
py3 = False
else:
py3 = True
if py3:
basstring = str
else:
basstring = basestring

然后在代码中:

anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
print("This is a string")
else:
print("No string")

小心点!在 python2中,strbytes本质上是相同的。如果您试图区分这两者,这可能会导致 bug。

>>> size = 5
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True