我有一个正在运行测试的 Python 包,但我不断收到一个无法跟踪的错误:
Traceback (most recent call last):
File "blah/tests/test_sync.py", line 105, in test_create_fence_sync
sync = self.dpy.create_sync(pegl.SyncType.FENCE)
File "blah/src/pegl/display.py", line 313, in create_sync
return Sync(self,
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
现在这很奇怪,因为Sync
该类在创建对象时没有什么特别之处——当然没有自定义__new__
方法。更奇怪的是:当我自己运行测试文件python tests/test_sync.py
时(当我打开 Python 解释器并手动运行这些步骤时,它也可以正常工作。nose2
pytest
我试过了:
- 切换到不同的测试运行器(如前所述,在
nose2
和上的结果相同)pytest
- 重写问题行以确保它一次只做一件事(这表明它肯定
Sync(...)
是给出错误的调用) - 逐步完成
pdb
(这没有帮助,因为它似乎没有进入对象构造) - 在不同的环境中进行测试(我已经
tox
设置为在 Python 3.7、3.8 和 3.9 上运行它,并且我已经在 Linux 和 Windows 上运行它;它在 Windows 上运行良好,但对于所有 Python 版本都以相同的方式失败Linux)
我该如何调试呢?我有什么明显的遗漏吗?是否有某种方式(通过pdb
或其他方式)进入对象创建,并实际看到__new__
并被__init__
调用?
如果您想查看实际发生的情况(失败的测试、方法、类),代码都在 Github上Display.create_sync
,Sync
但这里有一个简化版本:
class Display:
def create_sync(self, foo):
return Sync(self, do_some_ctypes_stuff_to_get_a_handle(foo))
class Sync:
def __init__(self, display, handle):
self._as_parameter_ = handle
self._display = display
这不是一个最小的可重现示例,因为这实际上并没有失败。我仍在努力想出一个可以做到的。