如何检查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
/ except
testing只进行一次,然后定义一个始终有效且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