Ran*_*unt 163 python string python-2.x python-3.x
我知道我可以使用: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
Run Code Online (Sandbox Code Playgroud)
和python-3.x没有 u"foo"
eca*_*mur 192
如果您正在编写兼容2.x和3.x的代码,则可能需要使用六个代码:
from six import string_types
isinstance(s, string_types)
Run Code Online (Sandbox Code Playgroud)
hbr*_*tow 108
我发现最简洁的方法,不依赖于六个包,是:
try:
basestring
except NameError:
basestring = str
Run Code Online (Sandbox Code Playgroud)
那么,假设你一直在以最通用的方式检查Python 2中的字符串,
isinstance(s, basestring)
Run Code Online (Sandbox Code Playgroud)
现在也适用于Python 3+.
Fil*_*Fil 32
这个怎么样,适用于所有情况?
isinstance(x, ("".__class__, u"".__class__))
Run Code Online (Sandbox Code Playgroud)
ste*_*eha 17
这是@Lev Levitsky的回答,重写了一下.
try:
isinstance("", basestring)
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)
Run Code Online (Sandbox Code Playgroud)
该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)
Run Code Online (Sandbox Code Playgroud)
不过,我认为通过电话会更容易isinstance().
tot*_*ico 10
该future库添加了(与Python 2)兼容的名称,因此您可以继续编写Python 3.您可以简单地执行以下操作:
from builtins import str
isinstance(x, str)
Run Code Online (Sandbox Code Playgroud)
要安装它,只需执行即可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)
Run Code Online (Sandbox Code Playgroud)
您可以通过调用获取对象的类object.__class__,因此为了检查对象是否是默认的字符串类型:
isinstance(object,"".__class__)
Run Code Online (Sandbox Code Playgroud)
并且您可以将以下内容放在代码的顶部,以便引号括起来的字符串在python 2中的unicode中:
from __future__ import unicode_literals
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70026 次 |
| 最近记录: |