Порт ser класса равен none, если не используется в __init__ - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу класс, который использует функцию get_serial_port (). Если self.ser.write ('at \ r') не вызывается в init , то self.ser - это None в другом месте класса. (обратите внимание, что функция get_serial_port проверяет связь перед возвратом экземпляра). Я предполагаю, что это как-то связано со сборкой мусора в классе Serial, но я не понимаю, что происходит. Почему это так?

Функция get_serial_port проверяет связь и возвращает экземпляр, связанный с com-портом. Функция init_module () запускает несколько функций, используя self.ser.write ('command'). Это работает как есть, но мне не нравится иметь код, который я не понимаю ...

class Device():
    def __init__(self, log = True, com_port=None, imei=None, ser=None, baud_rate=115200):
        if log:
            self.log = True
            self.log = Logger()
            self.log.start_log()
        if ser is None:
            try: 
                self.ser = get_serial_port(baud_rate=baud_rate)
                self.ser.write('at\r')
                print(self.ser.read(1000))
            except:
                print('ERROR: serial port connection failed')
            else:
                self.ser = ser
        self.imei = imei
        self.init_module()

1 Ответ

0 голосов
/ 03 апреля 2020

В коде есть некоторые проблемы. Во-первых, установка значения true в log ничего не делает, так как тот же экземпляр var перезаписывается в той же строке. Я не говорю, что это образцово, но было бы немного яснее? Я попытался переписать его, чтобы было легче отслеживать состояние.

Также добавлены некоторые условные обозначения c (не проверяйте явно на None, если это действительно не нужно)

class Device():
    def __init__(self, log = True, com_port=None, imei=None, ser=None, baud_rate=115200):
        self.log_enabled = log
        self.ser = ser
        self.imei = imei

        if log:
            self.logger = Logger()
            self.logger.start_log()

        if not self.ser:
            try: 
                self.ser = get_serial_port(baud_rate=baud_rate)
                self.ser.write('at\r')
                print(self.ser.read(1000))
            except:
                print('ERROR: serial port connection failed')

        self.init_module()

Примечание что я хранил log логическое значение отдельно до self.log_enabled, чтобы его можно было проверить в коде, если ведение журнала включено. Хотя есть и лучшие варианты:

  • Установить уровень ведения журнала при запуске, и вместо отключения ведения журнала установите его на warning или аналогичный, чтобы регистрировать только важные вещи
  • Вы также можете создать другой Null-логгер с интерфейсом, аналогичным Logger (), тогда вам не нужно будет использовать, если каждый раз

Но я бы go с уровнями журнала, тогда вы можете удалить первый if - удаление условных выражений обычно является очень хорошим способом упростить код - и просто go с уровнями журнала.

...