2014-10-08 3 views
0

Я думаю, что это будет наиболее легко продемонстрировано на примере, но вопрос является общим. Скажем, я использую библиотеку PyVISA, которая взаимодействует с устройствами GPIB с моей программой. Я создал класс питона для каждого инструмента, поэтому для питания, я мог бы что-то вроде этого:Программирование с подключенным оборудованием

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(); за исключением: do_something_else() '... и init, безусловно, должен вызвать ошибку о том, что nopowerupply не найден –

+1

@jonrsharpe: в вопросе говорится, что' open_resource' может возвращать 'None'. Таким образом, нет, '__init__' не потерпит неудачу в этом случае. Но исправление заключается в том, что _make_ в этом случае не работает. Добавьте 'if not self.ps: raise SomeException ('не удалось открыть ресурс')' или тому подобное. – abarnert

ответ

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') 

Теперь любой код, который конструкцииPowerSupply должен либо обработать это исключение или быть готовым распространять ее, но ваш вопрос подразумевает, что open_resource может вызвать исключение, так что это не может быть проблемой. Кроме того, это похоже на правильное место для обработки - на верхнем уровне вашей программы, где бы вы ни создавали PowerSupply в ответ на некоторые команды GUI или CLI или сети, здесь вы готовы справиться с тем, что не можете создать его, правильно?

И любой код, который использует уже построенный PowerSupply, не имеет о чем беспокоиться. Вы знаете self.ps is not None или вы не могли вернуть объект из конструктора.

Смежные вопросы