如果未在__init__中使用,则类服务端口为无

问题描述 投票:0回答:1

我正在编写一个使用函数get_serial_port()的类。如果未在init中调用self.ser.write('at \ r'),则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()
python python-3.x garbage-collection pyserial
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()

[请注意,我将log布尔值分别存储到self.log_enabled中,因此如果启用了日志记录,则可以在代码中对其进行检查。不过,还有更好的选择:

  • 在运行时设置日志级别,而不是禁用日志记录,将其设置为warning或类似的方式仅记录重要的事情
  • 您还可以使用类似于Logger()的界面创建另一个Null记录器,如果每次都不需要使用

但是我会使用日志级别,那么您可以删除第一个if-删除条件通常是简化代码的一种非常好的方法-仅使用日志级别。

© www.soinside.com 2019 - 2024. All rights reserved.