【问题标题】:Why isinstance('foo', str) == False为什么 isinstance('foo', str) == False
【发布时间】:2016-11-07 11:45:42
【问题描述】:

我使用futurize 轻轻地将我的模块迁移到 Python3,现在我的文件顶部有这个:

from builtins import str

future.types.newstr.BaseNewStr 导致我对 isinstance 的结果错误:

>>> isinstance('foo', (unicode, str))
False

如何正确解决这个问题?

请注意,添加from __future__ import unicode_literals 并没有帮助,因为isinstance 是从其他地方调用的函数调用的,如果unicode_literals 正确导入,我无法控制。

编辑

我发现我可以用这个:

def foo(string):
   import six
   if isinstance(string, six.string_types):
      return six.types.StringType('bar')

这看起来非常样板......

【问题讨论】:

  • 可能是因为您要导入的str 解析为class 对象(type(str)),而标准str 解析为type。反正这是我的猜测。
  • 看来你需要native string type

标签: python string python-2.7


【解决方案1】:

我不清楚你想用样板代码实现什么,但检查实例类型的正确方法就在那里。 要回答您的问题以修复isinstance 检查,您只需这样做

isinstance('foo', six.string_types)

是的,你还必须在任何你想使用它的地方导入six 库,这在处理 python2/3 代码时很常见。

顺便说一句,如果您不需要 python2 兼容性,而只想迁移到 python3,则不需要从 future(内置)导入

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2019-12-29
    • 1970-01-01
    • 2015-12-23
    • 2012-06-12
    • 1970-01-01
    • 2013-10-30
    • 2018-06-27
    • 2018-04-26
    相关资源
    最近更新 更多