pySerial如何在没有__enter__和__exit__的情况下实现"with"语句?
How does pySerial implement the "with" statement without __enter__ and __exit__?
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
的第 433 行,即 close()
函数。 with
语句是否也查找 open()
和 close()
函数?
Serial
class 没有实现这些方法,它继承自 io.IOBase
. The relevant part from /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
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
的第 433 行,即 close()
函数。 with
语句是否也查找 open()
和 close()
函数?
Serial
class 没有实现这些方法,它继承自 io.IOBase
. The relevant part from /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