pySerial如何在没有__enter__和__exit__的情况下实现"with"语句?

How does pySerial implement the "with" statement without __enter__ and __exit__?

pySerial 可以与 Python 的 with 语句一起使用,如下所示:

with serial.Serial("/dev/ttyS1") as ser:
    ser.write("AAAA")
    ser.read(8)

我试图了解 pySerial 到底做了什么来完成这项工作,但我在任何地方都找不到 __enter____exit__ 函数!我从 pySerial 目录 运行 grep -e '\(__enter__\)\|\(__exit__\)' *.py ,但 grep 没有找到这两个函数。 pySerial 是怎么做到的?

编辑:我还尝试了以下方法以查看接下来调用的是什么:

import serial, pdb
with serial.Serial("/dev/ttyUSB0") as ser:
    pdb.set_trace()

这直接将我带到 serialposix.py 的第 433 行,即 close() 函数。 with 语句是否也查找 open()close() 函数?

Serial class 没有实现这些方法,它继承自 io.IOBase. The relevant part from /serial/serialposix.py:

try:
    import io
except ImportError:
    # classic version with our own file-like emulation
    class Serial(PosixSerial, FileLike):
        pass
else:
    # io library present
    class Serial(PosixSerial, io.RawIOBase):
        pass