Python3.x中的StringType和NoneType

25 投票
2 回答
27693 浏览
提问于 2025-04-16 07:22

我有一个代码库,在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,其他的也会像以前一样正常工作。

(另外,记得这一点,特别是StringTypeStringTypes之间的区别:)

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)

撰写回答