Python 用连接的硬件编程

Python 用连接的硬件编程,python,class,exception,hardware,hardware-interface,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')

我认为用一个例子最容易说明这一点,但问题是一般性的。假设我正在使用像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
,可以在每个测试方法中写入异常,但似乎必须有更好的方法。有吗

如果
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\u resource
可能会引发异常,所以这不会是问题。此外,这似乎是在程序的顶层处理它的正确位置,无论您在哪里创建
PowerSupply
以响应某些GUI或CLI或网络命令,您都准备好处理无法创建它的问题,对吗


任何使用已构建的
电源的代码都不需要担心。您知道
self.ps不是None
,或者您无法从构造函数中获取对象。

当然
\uuuuuu init\uuuuu
在这种情况下会失败,抛出错误?进一步jon的评论。。。调用方的工作应该是管理依赖项
try:ps=PowerSupply();除了:做点别的事()
。。。init肯定会引发一个关于无电源供应的错误found@jonrsharpe:问题是,
open\u resource
“可能返回
None
”。因此,在这种情况下,
\uuuuuu init\uuuuuu
不会失败。但解决办法是让它在这种情况下失败。如果不是self,则添加一个
。ps:引发一些异常('failed to open resource')
或诸如此类。您可以通过将
电源供应
注入
\uu init\uuuu()
方法而不是在其中构建它,从而进一步将其与资源解耦。这样,只要接口兼容,就可以切换实现。