Python3.x中的StringType和NoneType
我有一个代码库,在Python2.x中使用了StringType和NoneType这两种类型。但是在迁移到Python3时,测试失败了,因为Python3.x的类型模块里没有这两种类型。
我通过把它们分别替换成“str”和“None”来解决这个问题。我在想,是否还有其他更合适的方法来处理这个问题。现在我用的方法确实有效,但我心里有点不确定。
我应该继续使用我现在的方法,还是我做的有问题?如果有问题,我该怎么纠正呢?
2 个回答
7
如果可能的话,我建议你在值很明显的情况下,尽量避免使用types
里的值。比如说,当你要把一个方法绑定到一个对象上时,可以用types.MethodType
,但如果是types.StringTypes
,就直接用(str, unicode)
,或者用basestring
。
在这种情况下,我会这样做:
- 用
obj is None
或者obj is not None
,而不是isinstance(obj, NoneType)
或者not isinstance(obj, NoneType)
。 - 用
isinstance(obj, basestring)
,而不是isinstance(obj, StringTypes)
。 - 用
isinstance(obj, str)
,而不是isinstance(obj, StringType)
。
然后,当你需要为Python 3分发代码时,使用2to3
工具。这样你的basestring
就会变成str
,其他的也会像以前一样正常工作。
(另外,记得这一点,特别是StringType
和StringTypes
之间的区别:)
types.UnicodeType == unicode
types.StringType == str
types.StringTypes == (str, unicode)
)
26
检查一个对象是否是空值(None)通常是用 obj is None
这个方式,而检查一个对象是否是字符串一般用 isinstance(obj, str)
。在 Python 2.x 中,如果你想同时检测字符串和 Unicode 字符串,可以用 isinstance(obj, basestring)
。
如果你使用 2to3
工具,这样就足够了。但如果你想让一段代码在 Python 2 和 Python 3 中都能运行,你可能会写出类似下面的代码:
try:
return isinstance(obj, basestring)
except NameError:
return isinstance(obj, str)