Python 用连接的硬件编程
我认为用一个例子最容易说明这一点,但问题是一般性的。假设我正在使用像PyVISA这样的库,它将GPIB设备与我的程序连接起来。我已经为每个工具设置了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')
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()
方法而不是在其中构建它,从而进一步将其与资源解耦。这样,只要接口兼容,就可以切换实现。