"TypeError: read() takes exactly 1 argument (2 given)" when trying to use read() from subclass

"TypeError: read() takes exactly 1 argument (2 given)" when trying to use read() from subclass

我正在写一个 class 来扩展 pySerial 的 serial.Serial class,但我在使用 readline() 函数时遇到了问题。

我可以用最少的代码重现问题:

import serial
class A(serial.Serial):
    def read(self):
        return super(A, self).readline()

a = A()
a.read()

当我运行这段代码时,我得到一个回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in read
TypeError: read() takes exactly 1 argument (2 given)

我知道我在这里遗漏了一些东西。我希望它只传递一个参数 (self)。第二个参数从何而来?

此外,我尝试使用 inspect.getcallargs(a.read) 来找出第二个参数,但我得到了这个回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/inspect.py", line 900, in getcallargs
    args, varargs, varkw, defaults = getargspec(func)
  File "/usr/lib/python2.7/inspect.py", line 815, in getargspec
    raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <built-in method readline of A object at 0xecf3d0> is not a Python function

这是有道理的,假设 PySerial 的 readline() 是本机 C 函数或系统调用。我假设这就是发生这种情况的原因是否正确?

Serial.read() 接受一个可选参数 size,其默认值为 1。推测 Serial.readline() 使用此参数调用 read() 方法。你已经覆盖了 read(),但是你没有给你的版本 size 参数,所以当 readline() 调用你的版本 read().[=20 时你会得到一个错误=]

当您修复错误时,您可能会遇到递归问题;我怀疑 read() 方法不应该调用 readline().