我认为通过一个例子可以很容易地证明这一点,但问题是一般的问题。假设我正在使用像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
的方法中编写例外,但似乎必须有更好的方法。有吗?!
答案 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
或者您无法从构造函数中获取对象。