python3.x中的StringType和NoneType

时间:2010-11-20 09:48:25

标签: python python-3.x

我有一个代码库,它在python2.x代码库中使用StringType和NoneType(类型模块)。在移植到Python3时,测试失败,因为Python3.x中的类型模块没有上述两种类型。

我通过分别用“str”和“None”替换它们来解决问题。我想知道是否还有另一种(正确的)方法。我目前所做的事情似乎肯定有效,但我很怀疑。

  

我应该坚持我所遵循的方法还是我做了什么错了?如果是这样,我该如何纠正?

2 个答案:

答案 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 Noneobj 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,其余的将继续像以前一样工作。

(另外,请记住这一点,特别是StringTypeStringTypes之间的差异:

types.UnicodeType == unicode
types.StringType == str
types.StringTypes == (str, unicode)