0

我有一个正在运行测试的 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 解释器并手动运行这些步骤时,它也可以正常工作。nose2pytest

我试过了:

  • 切换到不同的测试运行器(如前所述,在nose2和上的结果相同)pytest
  • 重写问题行以确保它一次只做一件事(这表明它肯定Sync(...)是给出错误的调用)
  • 逐步完成pdb(这没有帮助,因为它似乎没有进入对象构造)
  • 在不同的环境中进行测试(我已经tox设置为在 Python 3.7、3.8 和 3.9 上运行它,并且我已经在 Linux 和 Windows 上运行它;它在 Windows 上运行良好,但对于所有 Python 版本都以相同的方式失败Linux)

我该如何调试呢?我有什么明显的遗漏吗?是否有某种方式(通过pdb或其他方式)进入对象创建,并实际看到__new__并被__init__调用?


如果您想查看实际发生的情况(失败的测试方法类),代码都在 GithubDisplay.create_syncSync但这里有一个简化版本:

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

这不是一个最小的可重现示例,因为这实际上并没有失败。我仍在努力想出一个可以做到的。

4

0 回答 0