1

我正在编写一个使用函数 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()
4

1 回答 1

0

代码中有一些问题。一方面,将 log 设置为 True 不会做任何事情,因为相同的实例 var 在同一行中被覆盖。我不是说这是模范,但这会更清楚一点吗?我试图重写它,以便更容易跟踪状态。

还添加了一些惯用的约定(除非真的需要,否则不要明确测试 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()

请注意,我将logboolean 单独存储到self.log_enabled,以便在启用日志记录时可以在代码中检查它。不过还有更好的选择:

  • 在运行时设置日志级别,而不是禁用日志记录,将其设置为warning或类似于仅记录重要的事情
  • 您也可以创建另一个 Null 记录器,其接口类似于 Logger(),然后您不需要每次都使用 if

但我会使用日志级别,然后您可以删除第一个if- 删除条件通常是简化代码的非常好的方法 - 并且只需使用日志级别。

于 2020-04-02T21:57:35.157 回答