【问题标题】:Programming with connected hardware使用连接的硬件进行编程
【发布时间】:2014-12-03 12:32:46
【问题描述】:

我认为这将通过一个示例最容易地证明,但问题是一般性的。假设我正在使用像 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 的方法中,但似乎必须有更好的方法。有吗?!

【问题讨论】:

  • 在这种情况下,__init__ 肯定会失败,抛出错误?
  • 进一步 jon 的评论......管理依赖项try:ps=PowerSupply(); except: do_something_else() 应该是调用者的工作......并且 init 肯定会引发关于找不到电源的错误
  • @jonrsharpe:问题是open_resource“可能会返回None”。所以不,__init__ 在这种情况下不会失败。但解决方法是 make 在这种情况下失败。添加if not self.ps: raise SomeException('failed to open resource') 等。
  • 您可以通过将PowerSupply 注入到__init__() 方法中而不是在其中构造它来进一步将PowerSupply 与您的资源分离。这样只要接口兼容就可以切换实现。

标签: python class exception hardware hardware-interface


【解决方案1】:

可以将异常写入每个测试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')

现在,构造 PowerSupply 的任何代码都必须处理该异常或准备传播它,但您的问题暗示 open_resource 无论如何都可能引发异常,因此可以不成问题。此外,这似乎是处理它的正确位置——在您的程序的顶层,无论您在哪里创建 PowerSupply 以响应某些 GUI、CLI 或网络命令,这就是您准备处理的地方无法创建,对吧?

并且任何使用已构建的PowerSupply 的代码都无需担心。你知道self.ps is not None 或者你无法从构造函数中取回对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2012-01-22
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多