以下是合理的方法吗?
with SerialPorts() as serial_ports:
in= SerialPort("COM1")
serial_ports.add(in)
out = SerialPort("COM2")
serial_ports.add(out)
# use in and out
其中SerialPorts
和SerialPort
实现了上下文管理器接口。
SerialPorts.exit()
循环添加的串口调用其exit()
。 SerialPort
的{{1}}关闭了串口。
有更好的方法吗?
答案 0 :(得分:2)
这个怎么样?
with SerialPorts("COM1", "COM2") as (inport, outport):
# use inport and outport
in
是python中的reserved word,使用它作为变量名将导致SyntaxError。
编辑:这是一种可能的实施方式(未经测试):
import serial
from contextlib import contextmanager
@contextmanager
def serial_ports(*args):
ports = [serial.Serial(arg) for arg in args]
try:
yield ports
finally:
for port in ports:
port.close()
with serial_ports('COM1', 'COM2') as (inp, outp):
print 'inp:', inp.isOpen(), 'outp:', outp.isOpen()
print 'inp:', inp.isOpen(), 'outp:', outp.isOpen()
但我在这个问题上遵从@agf。他的建议对你的情况要好得多。
答案 1 :(得分:2)
如果您运行此代码:
class A(object):
def __enter__(self):
return self
def __exit__(self, *args):
print "exit", self
class B(object):
def __enter__(self):
return self
def __exit__(self, *args):
print "exit", self
raise Exception
with A() as a, B() as b:
pass
即使有人提出错误(__exit__
之前的A
和B
之前的B
,也会看到A
被调用。
如果您从单个集体__exit__
同时拨打__exit__
,如果第一个集合有错误,则第二个__exit__
将不会被调用。
使用嵌套的上下文管理器,假设您的固定数量很少。