我有一个代码库,它在python2.x代码库中使用StringType和NoneType(类型模块)。在移植到Python3时,测试失败,因为Python3.x中的类型模块没有上述两种类型。
我通过分别用“str”和“None”替换它们来解决问题。我想知道是否还有另一种(正确的)方法。我目前所做的事情似乎肯定有效,但我很怀疑。
我应该坚持我所遵循的方法还是我做了什么错了?如果是这样,我该如何纠正?
答案 0 :(得分:22)
通常通过调用obj is None
来检查无,而检查字符串通常是isinstance(obj, str)
。在Python 2.x中检测字符串和unicode,可以使用isinstance(obj, basestring)
。
如果你使用2to3
,这已经足够了,但是如果你需要在Py2和Py3中使用单段代码,你可能会得到类似的东西:
try:
return isinstance(obj, basestring)
except NameError:
return isinstance(obj, str)
答案 1 :(得分:4)
如果可能的话,我会建议您避免使用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)
)