2015-03-17 3 views
1

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(). Вызывает ли оператор withopen() и close() функции?

+0

Wild догадка: он использует [ 'contextmanager'] (https://docs.python.org/2/library/contextlib.html#contextlib.contextmanager) декоратор. – Kevin

ответ

3

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 

 Смежные вопросы

  • Нет связанных вопросов^_^