Как pySerial реализует оператор "с" без __enter__ и __exit__?

pySerial можно использовать с Python with утверждение как это:

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

Я пытался понять, что именно PySerial делает, чтобы сделать эту работу, но я не смог найти __enter__ или же __exit__ функционировать где угодно! Я побежал grep -e '\(__enter__\)\|\(__exit__\)' *.py из каталога pySerial, и grep не нашел ни одной функции. Как pySerial это делает?

Редактировать: я также попробовал следующее, чтобы увидеть, что называется следующим:

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

Это привело меня прямо к линии 433 serialposix.py, close() функция. Ли with Заявление также искать open() а также close() функции?

1 ответ

Решение

Serial класс не реализует эти методы, он наследует их от io.IOBase, Соответствующая часть из /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
Другие вопросы по тегам