pySerial如何使用"实现"没有__enter__和__exit__的陈述?

时间:2015-03-17 20:15:09

标签: python pyserial contextmanager

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 close()函数的第433行。 with语句是否也会查找open()close()函数?

1 个答案:

答案 0 :(得分: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