У вас есть несколько очень похожих объектов, и в таких случаях часто лучше обращаться с ними единообразно и использовать подход, основанный на данных.
Итак, я бы начал с ваших ..._meter_address
объектов. Для меня они звучат как конфигурация для счетчиков, поэтому у меня есть класс, который выглядит примерно так:
class MeterConfiguration(object):
def __init__(self, name, address):
self.name = name
self.address = address
def english_name(self):
"""A readable form of the name for this meter."""
return ' '.join(x.title() for x in self.name.split('_')) + ' Meter'
Возможно, у вас есть еще какая-то конфигурация (в настоящее время хранящаяся в переменных), которая также может войти сюда.
Тогда у меня будет сводка всех счетчиков, с которыми работает ваша программа. Я создаю их статически, но для вас может быть правильным прочитать всю или часть этой информации из файла конфигурации. Я понятия не имею, как выглядят ваши адреса, поэтому я что-то придумал:)
ALL_METERS = [
MeterConfiguration('anodization_voltage', 'PORT0001'),
MeterConfiguration('anodization_current', 'PORT0002'),
MeterConfiguration('sample_thermometer', 'PORT0003'),
MeterConfiguration('heater_thermometer', 'PORT0004')
]
Круто, теперь все настройки в одном месте, и мы можем использовать это, чтобы сделать вещи единообразными и более простыми.
private.meters = {}
any_errors = False
for meter in ALL_METERS:
try:
private.meters[meter.name] = Voltmeter(meter.address)
except VisaError:
logging.error('%s not found at %s', meter.english_name(), meter.address)
any_errors = True
if not any_errors:
logging.info('All meters initialized.')
Вы можете использовать, например, private.meters['anodization_voltage']
, чтобы обратиться к определенному метру, или выполнить итерацию по счетчику, если вам нужно что-то сделать со всеми ними.