我知道我可以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"
Answers:
如果要编写兼容2.x和3.x的代码,则可能要使用六个:
from six import string_types
isinstance(s, string_types)
>>> isinstance(u"foo", string_types) True >>> isinstance(u"foo".encode("utf-8"), string_types) True 我期望isinstance(u“ foo”,string_types)返回false。
str和unicode对Python 2中,或strPython的3.如果你不想unicode指望Python 2中,只需要使用str。
future包装中使用它,而不是six:from future.utils import string_types
我发现不依赖六个软件包的最简洁的方法是:
try:
basestring
except NameError:
basestring = str
然后,假设您以最通用的方式检查了Python 2中的字符串,
isinstance(s, basestring)
现在也将适用于Python 3+。
basestring = (str, bytes)摘自requests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
那在所有情况下都可行吗?
isinstance(x, ("".__class__, u"".__class__))
from __future__ import unicode_literals活跃。现在我要去:isinstance(val, (str, 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)
我认为,致电会更容易isinstance()。
isinstance("", basestring)这就是我所说的“打电话”的意思。无论如何,+ 1。
try: string_types = basestring except NameError: string_types = str
该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)
isinstance(u'hello', basestr)可以SyntaxError: invalid syntax为我带来收益。它似乎并不像u-我得到这个错误与str和basestr
try/ except测试,并根据该次测试的结果isstr()正确定义。每次调用时都无需产生异常的开销isstr()。
您可以通过调用来获取对象的类object.__class__,以便检查object是否为默认字符串类型:
isinstance(object,"".__class__)
而且您可以将以下内容放在代码的顶部,以便用引号括起来的字符串在python 2中的unicode中:
from __future__ import unicode_literals
some_element.text是'str',但与'unicode'的比较将失败
您可以在代码的开头尝试此操作:
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")