10.6 é‡�æ–°åŠ è½½æ¨¡å�—¶
问题¶
ä½ æƒ³é‡�æ–°åŠ è½½å·²ç»�åŠ è½½çš„æ¨¡å�—ï¼Œå› ä¸ºä½ å¯¹å…¶æº�ç �进行了修改。
解决方案¶
使用imp.reload()æ�¥é‡�æ–°åŠ è½½å…ˆå‰�åŠ è½½çš„æ¨¡å�—。举个例å�:
>>> import spam
>>> import imp
>>> imp.reload(spam)
<module 'spam' from './spam.py'>
>>>
讨论¶
é‡�æ–°åŠ è½½æ¨¡å�—在开å�‘和调试过程ä¸å¸¸å¸¸å¾ˆæœ‰ç”¨ã€‚但在生产环境ä¸çš„代ç �使用会ä¸�å®‰å…¨ï¼Œå› ä¸ºå®ƒå¹¶ä¸�总是åƒ�æ‚¨æœŸæœ›çš„é‚£æ ·å·¥ä½œã€‚
reload()擦除了模å�—底层å—典的内容,并通过é‡�新执行模å�—çš„æº�代ç �æ�¥åˆ·æ–°å®ƒã€‚模å�—对象本身的身份ä¿�æŒ�ä¸�å�˜ã€‚å› æ¤ï¼Œè¯¥æ“�作在程åº�䏿‰€æœ‰å·²ç»�被导入了的地方更新了模å�—。
尽管如æ¤ï¼Œreload()没有更新åƒ�â€�from module import nameâ€�è¿™æ ·ä½¿ç”¨importè¯å�¥å¯¼å…¥çš„定义。举个例å�:
# spam.py
def bar():
print('bar')
def grok():
print('grok')
现在�动交互�会�:
>>> import spam
>>> from spam import grok
>>> spam.bar()
bar
>>> grok()
grok
>>>
ä¸�退出Python修改spam.pyçš„æº�ç �,将grok()函数改æˆ�è¿™æ ·ï¼š
def grok():
print('New grok')
现在回到交互å¼�会è¯�,é‡�æ–°åŠ è½½æ¨¡å�—,å°�试下这个实验:
>>> import imp
>>> imp.reload(spam)
<module 'spam' from './spam.py'>
>>> spam.bar()
bar
>>> grok() # Notice old output
grok
>>> spam.grok() # Notice new output
New grok
>>>
在这个例å�ä¸ï¼Œä½ 看到有2个版本的grok()å‡½æ•°è¢«åŠ è½½ã€‚é€šå¸¸æ�¥è¯´ï¼Œè¿™ä¸�æ˜¯ä½ æƒ³è¦�的,而是令人头疼的事。
å› æ¤ï¼Œåœ¨ç”Ÿäº§çŽ¯å¢ƒä¸å�¯èƒ½éœ€è¦�é�¿å…�é‡�æ–°åŠ è½½æ¨¡å�—。在交互环境下调试,解释程åº�并试图弄懂它。