我認爲這將通過一個例子很容易地演示,但問題是一個普遍的問題。假設我正在使用像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__'在這種情況下應該失敗,拋出一個錯誤? – jonrsharpe 2014-10-08 18:27:47
來進一步jon的評論...它應該是調用者的工作來管理依賴關係 'try:ps = PowerSupply();除了:do_something_else()'...和init應該肯定會發現一個關於沒有powersupply發現的錯誤 – 2014-10-08 18:30:24
@jonrsharpe:問題說'open_resource'「可能會返回'None'」。所以不,'__init__'在這種情況下不會失敗。但是解決辦法是在這種情況下使其失敗。添加一個'if not self.ps:raise SomeException('打開資源失敗')'或類似的東西。 – abarnert 2014-10-08 19:36:11