我知道我可以使用: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
而python-3.x没有u"foo"
我知道我可以使用: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
而python-3.x没有u"foo"
如果您正在编写与 2.x 和 3.x 兼容的代码,您可能需要使用6 个:
from six import string_types
isinstance(s, string_types)
我发现的最简洁的方法不依赖于像六个这样的包,是:
try:
basestring
except NameError:
basestring = str
然后,假设您一直在以最通用的方式检查 Python 2 中的字符串,
isinstance(s, basestring)
现在也适用于 Python 3+。
怎么样,在所有情况下都有效?
isinstance(x, ("".__class__, u"".__class__))
这是@Lev Levitsky 的答案,稍微改写了一下。
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)
不过,我认为调用 to 更容易isinstance()
。
该future
库添加(到 Python 2)兼容名称,因此您可以继续编写 Python 3。您可以简单地执行以下操作:
from builtins import str
isinstance(x, str)
要安装它,只需执行pip install future
.
需要注意的是,它只支持python>=2.6
, >=3.3
,但它比six
, 更现代,只有在使用时才推荐python 2.5
也许使用类似的解决方法
def isstr(s):
try:
return isinstance(s, basestring)
except NameError:
return isinstance(s, str)
您可以通过调用来获取对象的类object.__class__
,因此为了检查对象是否为默认字符串类型:
isinstance(object,"".__class__)
您可以将以下内容放在代码的顶部,以便用引号括起来的字符串在 python 2 中是 unicode:
from __future__ import unicode_literals
您可以在代码开头尝试此操作:
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")
当心!在python 2中,str
和bytes
本质上是一样的。如果您试图区分两者,这可能会导致错误。
>>> size = 5
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True
类型(字符串)== str
如果是字符串则返回 true,否则返回 false