Как 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