2014-10-08 4 views
0

이 예제는 예제를 통해 가장 쉽게 설명 할 수 있지만 일반적인 질문입니다. 내 프로그램과 GPIB 장치를 연결하는 PyVISA와 같은 라이브러리를 사용한다고 가정 해보십시오. 나는 각 악기에 대한 파이썬 클래스를 설정 한, 그래서 전원 공급 장치, I는 다음과 같이 할 수도 있습니다 :연결된 하드웨어를 사용한 프로그래밍

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이 아닌지 테스트하는 모든 메서드에 예외를 작성할 수 있지만 더 좋은 방법이 있어야합니다. 거기 있니?!

+1

확실하게'__init__'가 실패하면 오류가 발생합니까? – jonrsharpe

+0

더 jon의 코멘트에 ... 의존성을 관리하는 것은 호출자의 작업이어야합니다. 'try : ps = PowerSupply(); except : do_something_else()'... 그리고 init은 powersupply가 없다는 것에 대한 오류를 분명히 제기해야합니다. –

+1

@jonrsharpe :'open_resource' "는'None'을 반환 할 것입니다." 그래서, 아니오,'__init__'는이 경우 실패하지 않습니다. 그러나이 문제는 실패 할 수 있습니다. 'self.ps : raise SomeException이 아니라면 ('리소스를 열지 못했습니다 ')'등을 추가하십시오. – abarnert

답변

2

self.ps이 존재하는지 테스트하는 모든 메소드에 예외를 작성할 수 있지만 더 좋은 방법이 있어야합니다. 거기 있니?!

예. self.psNone 일 경우 코드를 작성한 방법은 처음부터 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_resource은 어쨌든 예외를 발생시킬 수 있으므로 문제가 될 수 없습니다. 게다가 GUI 나 CLI 또는 네트워크 명령에 대한 응답으로 PowerSupply을 만들 때 어디서나 프로그램의 최상위 수준에서 처리 할 수있는 적절한 장소와 같이 보이기 때문에 처리 할 준비가되어 있습니다. 그것을 만들지, 그렇지?

그리고 이미 구성된 PowerSupply을 사용하는 코드는 걱정할 필요가 없습니다. self.ps is not None을 알고 있거나 생성자에서 객체를 다시 얻을 수 없었습니다.

관련 문제