我知道我可以在 python-3.x 中使用: isinstance(x, str),但是我需要检查 python-2.x 中是否也有字符串。isinstance(x, str)在 python-2.x 中是否能正常工作?或者我需要检查版本和使用 isinstance(x, basestr)?
isinstance(x, str)
isinstance(x, basestr)
具体来说,在 python-2. x 中:
>>>isinstance(u"test", str) False
而 python-3.x 没有 u"foo"
u"foo"
也许可以用一个变通方法
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测试完成一次,然后定义一个始终工作并且尽可能快的函数。
try
except
编辑: 实际上,我们甚至不需要调用 isinstance(); 我们只需要评估 basestring,看看我们是否得到 NameError:
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 是否是默认的字符串类型:
object.__class__
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:
future
from builtins import str isinstance(x, str)
要安装它 ,只需执行 pip install future。
pip install future
作为一个 警告,它只支持 python>=2.6,>=3.3,但它是更现代的 six,这是只有 建议如果使用 python 2.5
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中,str和 bytes本质上是相同的。如果您试图区分这两者,这可能会导致 bug。
str
bytes
>>> size = 5 >>> byte_arr = bytes(size) >>> isinstance(byte_arr, bytes) True >>> isinstance(byte_arr, str) True