? 前兩天發(fā)現(xiàn)python一個很有趣的庫,itchat,它提供了很多微信的接口,可以利用它來做很多微信相關(guān)的事情,比如收發(fā)消息,聊天備份等。
? 但是寫的時候發(fā)現(xiàn)一個很尷尬的問題,就是每次改完代碼重新運行后都得重新掃描微信二維碼重新登錄,重新初始化數(shù)據(jù),確實挺麻煩的。然后就想到了暑假的時候在網(wǎng)易游戲做的熱補丁功能,這樣就可以讓程序在運行的過程中改動或者添加我新的代碼了。
? 當(dāng)時做的hotfix比較麻煩,需要支持類、函數(shù)、方法、變量的各種補丁,其實python作為面向?qū)ο蟮膭討B(tài)語言,修改函數(shù)只要fun_old=fun_new就可以了,因為python中萬物皆對象。但是當(dāng)時做的時候出現(xiàn)了作用域的問題,所以不能這么簡單地賦值,就通過修改fun.func_code等屬性進行賦值修改,我記得是要重新賦值3個變量。但是具體忘記了,翻出來當(dāng)時的筆記本上也只記了func_code這一個屬性。所以還是得做記錄啊。。這也是我寫這篇文字的理由之一。
? 不過只修改函數(shù)并不復(fù)雜,直接賦值就好了,但是itchat中的相應(yīng)函數(shù)是需要用itchat.msg_register修飾符注冊的,這樣就不好直接對函數(shù)進行賦值了,當(dāng)然也可以Import hotfix_code之后對整個函數(shù)進行重新注冊,但感覺這樣做不美觀,而且需要自己控制循環(huán)刷新了。其實只要在每次有操作的時候進行一次熱更新就可以了。
因此決定這樣寫
import hotfix_code
hotfix_version = hotfix_code.hotfix_version
def inner_func(msg):
itchat.send(u'熱更新函數(shù)未導(dǎo)入', FILEHELPER)
@itchat.msg_register
def simple_reply(msg):
#第一步判斷是否是發(fā)給文件助手的指令,是的話調(diào)用指令相應(yīng)的操作函數(shù)
#第二步判斷是否是自己發(fā)出的消息,自己發(fā)出的消息也是不需要處理的
#定義熱更新函數(shù)
? 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)