1

以下是合理的方法吗?

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'exit()关闭串行端口。

有没有更好的方法来做到这一点?

4

2 回答 2

2

这个怎么样?

with SerialPorts("COM1", "COM2") as (inport, outport):
    # use inport and outport

in是 python 中的保留字,使用它作为变量名会导致 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。他的建议对你的情况要好得多。

于 2011-10-25T15:47:03.750 回答
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__即使一个引发错误(使用AbeforeBBbefore A),您也会看到两个s 都被调用。

如果您__exit__从一个集体中调用两个 s __exit__,如果第一个有错误,则第二个__exit__不会被调用。

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

于 2011-10-25T15:53:05.917 回答