我在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
在两个方法调用之间不会发生变化据我所知,没有人重新定义isinstance
或str
。但id
的str
确实从TheirClass
的外部构造函数更改为其内部。
答案 0 :(得分:1)
最后的线索是id
的{{1}}发生了变化。虽然没有str
或str
的分配,但仍有导入内容。具体做法是:
def str