串行端口上下文管理器

时间:2011-10-25 15:31:53

标签: python contextmanager

以下是合理的方法吗?

with SerialPorts() as serial_ports:
    in= SerialPort("COM1")
    serial_ports.add(in)
    out = SerialPort("COM2")
    serial_ports.add(out)

    # use in and out

其中SerialPortsSerialPort实现了上下文管理器接口。

SerialPorts.exit()循环添加的串口调用其exit()SerialPort的{​​{1}}关闭了串口。

有更好的方法吗?

2 个答案:

答案 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__之前的AB之前的B,也会看到A被调用。

如果您从单个集体__exit__同时拨打__exit__,如果第一个集合有错误,则第二个__exit__将不会被调用。

使用嵌套的上下文管理器,假设您的固定数量很少。