什么时候str不是str?

时间:2017-09-12 15:37:13

标签: python string python-3.x

我在Python3中遇到问题,其中str不是str。我正在完成一个2to3项目,并且由于第三方课程中的类型检查而导致我失败。对于它的价值,这在Python 2中没有发生。以下示例没有错误,但与我的问题类似:

class TheirClass():
    # I don't love that they're using `id` here, but they are
    def __init__(self, name, id=None):
        if isinstance(name, str):
            self.name = name
        else:
            raise TypeError('name is not a str')

my_object = TheirClass('a name')
print('Yep that worked')

我还没有把它减少到MCVE,但我知道以下事情:

  • 我将str传递给TheirClass.name
  • 的构造函数
  • TheirClass.__init__ isinstance(name, str) == True
  • 内部TheirClass.__init__ isinstance(name, str) == False
  • 内部TheirClass.__init__ type(name)返回<class str>
  • 内部TheirClass.__init__ dir(name) == dir(str)
  • inspect.getmro报告我的伪str没有__mro__
  • 在代码中重命名id后,我看到了id(str) != id(type(name))
  • id对象的name在两个方法调用之间不会发生变化

据我所知,没有人重新定义isinstancestr。但id str确实TheirClass的外部构造函数更改为其内部。

1 个答案:

答案 0 :(得分:1)

最后的线索是id的{​​{1}}发生了变化。虽然没有strstr的分配,但仍有导入内容。具体做法是:

def str