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