当我尝试创建类的实例时,我以某种方式得到了一个奇怪的错误。
...
File <file1>, line 242, in some_method
created_object = SubClass(obj1, obj2)
File <file2>, line 11, in __init__
SuperClass.__init__(self, obj1)
TypeError: expected string or buffer
这是两个__init__
方法的样子:
class SubClass(SuperClass):
def __init__(self, obj1=None, obj2=None):
SuperClass.__init__(self, obj1)
...
和
class SuperClass(object):
def __init__(self, obj1=None, obj2=None):
self.obj1 = obj1
创建子类实例的“file1”中的相同代码也会创建同一超类的其他子类的实例。它们都接收与参数类似的对象,但只有一个子类导致此错误。此外,至少有一个工作子类具有完全相同的定义和__init__
方法的第一行。
在我对“file1”进行了一些更改之后,最近出现了这个错误,但是我没有触及我实例化子类对象或传递给它们的对象的方式。
无论如何,我根本不理解错误。什么是字符串或缓冲区,为什么?
任何人都可以解释这个错误吗?
修改
self.SubClass = getattr(importlib.import_module(subclass_module), 'SubClass')
del sys.modules[subclass_module] # Premature optimization strikes again!
正如我发布的答案中所解释的那样,我发现以上是导致此错误发生的原因。然而,一点点挖掘让我对错误本身更加困惑。我将__init__
方法更改为:
def __init__(self, obj1=None, obj2=None):
print None.__init__
None.__init__('Hello', 'World')
并称之为:
print None.__init__
None.__init__('Hello', 'World')
obj = self.SubClass(obj1, obj2)
并且我仍在TypeError
方法中获取__init__
,但在我之前调用它时却没有。{以下是使用dis
module
# None.__init__('Hello', 'World') in SubClass.__init__
10 9 LOAD_CONST 0 (None)
12 LOAD_ATTR 1 (__init__)
15 LOAD_CONST 1 ('Hello')
18 LOAD_CONST 2 ('World')
21 CALL_FUNCTION 2
24 POP_TOP
# None.__init__('Hello', 'World') right before I try to create the SubClass object
246 147 LOAD_CONST 0 (None)
150 LOAD_ATTR 7 (__init__)
153 LOAD_CONST 5 ('Hello')
156 LOAD_CONST 6 ('World')
159 CALL_FUNCTION 2
162 POP_TOP
我输入的两张照片的输出是:
<method-wrapper '__init__' of NoneType object at 0x102977538>
<method-wrapper '__init__' of NoneType object at 0x102977538>
因此,每次使用常量调用时,它都是相同的__init__
方法,但结果不同。这是怎么回事?
答案 0 :(得分:0)
更改为super(SubClass, self).__init__(obj)
并未解决问题,但确实将错误更改为:
TypeError: must be type, not None
Based on something I learned previously导致此问题的更改是我尝试做的一些(可能是过早的)内存优化 - 从sys.modules
删除模块。随之而来的是垃圾收集,SubClass
和SuperClass
的导入都变为None
。将模块保留在sys.modules
中可以解决问题。
知道错误的原因并不能帮助我理解错误本身。我仍然不明白为什么我会得到TypeError: expected string or buffer
。