前两天发现python一个很有趣的库,itchat,它提供了很多微信的接口,可以利用它来做很多微信相关的事情,比如收发消息,聊天备份等。
但是写的时候发现一个很尴尬的问题,就是每次改完代码重新运行后都得重新扫描微信二维码重新登录,重新初始化数据,确实挺麻烦的。然后就想到了暑假的时候在网易游戏做的热补丁功能,这样就可以让程序在运行的过程中改动或者添加我新的代码了。
当时做的hotfix比较麻烦,需要支持类、函数、方法、变量的各种补丁,其实python作为面向对象的动态语言,修改函数只要fun_old=fun_new就可以了,因为python中万物皆对象。但是当时做的时候出现了作用域的问题,所以不能这么简单地赋值,就通过修改fun.func_code等属性进行赋值修改,我记得是要重新赋值3个变量。但是具体忘记了,翻出来当时的笔记本上也只记了func_code这一个属性。所以还是得做记录啊。。这也是我写这篇文字的理由之一。
不过只修改函数并不复杂,直接赋值就好了,但是itchat中的相应函数是需要用itchat.msg_register修饰符注册的,这样就不好直接对函数进行赋值了,当然也可以Import hotfix_code之后对整个函数进行重新注册,但感觉这样做不美观,而且需要自己控制循环刷新了。其实只要在每次有操作的时候进行一次热更新就可以了。
因此决定这样写
import hotfix_code
hotfix_version = hotfix_code.hotfix_version
def inner_func(msg):
itchat.send(u'热更新函数未导入', FILEHELPER)
@itchat.msg_register
def simple_reply(msg):
#第一步判断是否是发给文件助手的指令,是的话调用指令相应的操作函数
#第二步判断是否是自己发出的消息,自己发出的消息也是不需要处理的
#定义热更新函数
global hotfix_version
reload(hotfix_code)
if hotfix_code.hotfix_version!=hotfix_version:
hotfix_version.func_code=hotfix_code.hotfix_version.func_code
zhs_log('\n\n\n\n\n=================== new hotfix version '+str(hotfix_version)+' start===============')
inner_func=hotfix_code.inner_func
return inner_func(msg)