在尝试创建类的实例时,我莫名其妙地收到了一个奇怪的错误。
...
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
# 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__
每次使用常量调用时都是相同的方法,但是结果却不同。这里发生了什么?
更改为super(SubClass, self).__init__(obj)
不能解决问题,但确实将错误更改为:
TypeError: must be type, not None
根据我先前学到的知识,导致此问题的更改是我正在尝试进行的某些(可能为时过早的)内存优化-从中删除模块sys.modules
。随之而来的是垃圾收集,并且SubClass
和的进口都SuperClass
变成了None
。将模块保留在其中可以sys.modules
消除该问题。
虽然知道错误的原因并不能帮助我理解错误本身。我仍然不明白我为什么得到TypeError: expected string or buffer
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句