xfgryujk / blivedm

获取bilibili直播弹幕,使用WebSocket协议,支持web端和B站直播开放平台两种接口
MIT License
1.05k stars 225 forks source link

Deal with some kinds of warning from PyCharm #16

Closed LucienShui closed 3 years ago

LucienShui commented 3 years ago

改掉了一些 PyCharm 的 Warning。

xfgryujk commented 3 years ago

呃,我还没有这么强迫症 _COMMAND_HANDLERS作为类属性才是合理的,又不会跟着实例变化

LucienShui commented 3 years ago

呃,我还没有这么强迫症 _COMMAND_HANDLERS作为类属性才是合理的,又不会跟着实例变化

首先,我不认为这是强迫症。

其次,我认为 _COMMAND_HANDLERS 作为实例的变量更合理一些,原因有四:

  1. 修改类变量是不安全的,详见 Sample Code。
  2. 在新的子类里会更改 _COMMAND_HANDLERS 的内容,通过继承的方式去取代 copy() 会更平滑。
  3. 在实例的运行过程中也会改变 _COMMAND_HANDLERS 的内容,在实例方法中变更类变量是很奇怪的。
  4. 作为类变量的话,在 lambda 中要引用 “外部实例” 的私有函数,也是很别扭的。

Sample Code:

class Super:
    DICT = {
        "Hello": "World!"
    }

    def print(self):
        print(*list(self.DICT.items())[0])

    def modify(self):
        self.DICT['Hello'] = 'Python'

class SubClass(Super):
    DICT = Super.DICT.copy()

def main():
    for obj in [Super(), SubClass()]:
        obj.print()
        obj.modify()
        obj.print()
        print('-' * 3)

    Super().print()

if __name__ == '__main__':
    main()

Output:

Hello World!
Hello Python
---
Hello World!
Hello Python
---
Hello Python
xfgryujk commented 3 years ago

修改_COMMAND_HANDLERS唯一的原因就是我不想看到一堆未知命令的日志,算是偷懒的方法,其他时候就当它是个常量