pySerial можно использовать с with
заявлением Пайтона так:Как pySerial реализует оператор «с» без __enter__ и __exit__?
with serial.Serial("/dev/ttyS1") as ser:
ser.write("AAAA")
ser.read(8)
Я пытался увидеть именно то, что это pySerial делает, чтобы сделать эту работу, но я не мог найти __enter__
или __exit__
функцию в любом месте! Я запустил grep -e '\(__enter__\)\|\(__exit__\)' *.py
из каталога pySerial, и grep не нашел ни одну из функций. Как это делает pySerial?
Edit: Я также попытался следующие, чтобы увидеть, что было названо в следующем:
import serial, pdb
with serial.Serial("/dev/ttyUSB0") as ser:
pdb.set_trace()
Это привело меня непосредственно к линии 433 serialposix.py
, функция close()
. Вызывает ли оператор with
open()
и close()
функции?
Wild догадка: он использует [ 'contextmanager'] (https://docs.python.org/2/library/contextlib.html#contextlib.contextmanager) декоратор. – Kevin