用连接的硬件编程

时间:2014-10-08 18:24:40

标签: python class exception hardware hardware-interface

我认为通过一个例子可以很容易地证明这一点,但问题是一般的问题。假设我正在使用像PyVISA这样的库,它将GPIB设备与我的程序连接起来。我为每个乐器设置了一个python类,所以对于电源,我可能有这样的东西:

import visa

class PowerSupply:
    def __init__(self):
        rm = visa.ResourceManager()
        self.ps = rm.open_resource('GPIB0::12::INSTR')
    def getVoltage(self):
        return self.ps.ask('VOLT?')
    def setVoltage(self,v):
        self.ps.write('VOLT '+str(v))
    ...

ps = PowerSupply()
ps.setVoltage(10)

不幸的是,如果某个设备不存在于该地址,rm.open_resource函数可能无法正常工作,或者可能会返回None(在我的代码中我实际编写了一个执行此操作的函数代替)。我的问题是:对像PowerSupply这样的类进行编码的最佳做法是什么?可以在每个测试self.ps存在/不是None的方法中编写例外,但似乎必须有更好的方法。有吗?!

1 个答案:

答案 0 :(得分:2)

  

可以在每个测试self.ps存在/不是None的方法中写入异常,但似乎必须有更好的方法。有吗?!

是。您编写代码的方式如果self.ps始终为None,则从一开始就是None,并且永远不会再次更改。因此,不要在每种方法中测试它,只需测试一次:

def __init__(self):
    rm = visa.ResourceManager()
    self.ps = rm.open_resource('GPIB0::12::INSTR')
    if self.ps is None:
        raise PowerSupplyException('Unable to open resource GPIB0::12::INSTR')

现在,构造 a PowerSupply的任何代码都必须处理该异常或准备传播它,但您的问题意味着open_resource可能会引发异常,这样就不成问题了。此外,这似乎是处理它的正确位置 - 在您的程序的顶层,无论您在何处创建PowerSupply以响应某些GUI或CLI或网络命令,在那里你准备处理无法创建它,对吗?

使用已构建的PowerSupply的任何代码都没有什么可担心的。您知道self.ps is not None或者您无法从构造函数中获取对象。