如何检查variables是否与Python 2和3兼容的string

我知道我可以在python-3.x中使用: isinstance(x, str) ,但是我需要检查python-2.x中是否有string。 请问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兼容的代码,你可能需要使用六个 :

 from six import string_types isinstance(s, string_types) 

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

 try: basestring except NameError: basestring = str 

那么,假设您已经以最通用的方式检查了Python 2中的string,

 isinstance(s, basestring) 

现在也适用于Python 3+。

这是@Lev Levitsky的答案,重新写了一下。

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

try / excepttesting只进行一次,然后定义一个始终有效且function尽可能快的function。

编辑:其实,我们甚至不需要调用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(x, ("".__class__, u"".__class__)) 

也许使用类似的解决方法

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

你可以通过调用object.__class__来获得对象的类,所以为了检查对象是否是默认的stringtypes:

  isinstance(object,"".__class__) 

你可以把下面的代码放在你的代码的顶部,这样引号括起来的string在python 2中是unicode:

  from __future__ import unicode_literals 

future库增加了(与Python 2 兼容的)名称 ,所以你可以继续编写Python 3 。 你可以简单地做到以下几点:

 for builtins import str isinstance(x, str) 

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

作为一个警告 ,它只支持python>=2.6>=3.3 ,但它比six更现代化,这是只推荐使用python 2.5

types(string)== str

如果其string返回true,否则返回false