我正在编写一个使用函数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()
代码中有一些问题。一方面,将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
或类似的方式仅记录重要的事情但是我会使用日志级别,那么您可以删除第一个if
-删除条件通常是简化代码的一种非常好的方法-仅使用日志级别。