【发布时间】: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