2015-07-05 35 views
5

Recentemente ho effettuato il passaggio da python 2 a python 3. Python 3 documentation letture: "Rimosso il ricaricamento(). Imp.reload()" In realtà non dice il perché.Perché è stato rimosso il ricaricamento dai builtin python nell'interruttore in python3?

This domanda descrive come si fa ora in Python 3. Qualcuno ha qualche idea del perché è stato rimosso dai built-in e ora richiede imp o importlib per ricaricare? Quando si esegue il test di un programma mentre lo si genera utilizzando il prompt interattivo, il ricaricamento immediato è molto comodo. Ovviamente posso ottenere che indietro facendo qualcosa di simile

from imp import reload 

E 'solo un'altra linea di codice ogni volta che apro un prompt interattivo per il codice di prova. Qual è il motivo dietro questo cambiamento?

+0

È necessario meno universale o importante i restanti built-in. Essere a portata di mano in uno specifico contesto di esecuzione non cambia questo. – user2864740

+2

Penso che lo fosse perché troppe persone l'hanno visto seduto lì nei builtins e l'hanno usato senza capirne i limiti. Inserirlo in un modulo rendeva meno probabile che le persone lo usassero senza sapere cosa stavano facendo. Non riesco a trovare una fonte affidabile per queste informazioni però. – BrenBarn

risposta

3

reload() stato rimosso dal built-in come uno dei Python deplora Guido espresso in una Keynote address at OSCON 2002 (slitta 6). Vedi PEP 3100 - Miscellaneous Python 3.0 Plans che indica diverse modifiche che seguono la loro origine in quella conversazione.

Dalla diapositiva direi che si aspetta exec() da utilizzare; che certamente coprirà il più comune utilizzo di codice iterativo in un editor e lo ricontrollerà in un interprete interattivo.

Tuttavia, quando si parla di PEP 3121 - Extension Module Initialization and Finalization Guido trovato subito che gli mancava la funzione:

Sì; Non sono sicuro che il caricamento del modulo continui a essere supportato in Py3k oppure no. In caso contrario, dovrebbe essere rimosso dal PEP, se sì, è necessario specificare .

sto già manca il built-reload(), quindi penso che dovrebbe essere tenuto intorno in qualche forma. Prevedo che alcune forme di funzionalità di ricarica rimarranno disponibili , forse da qualche parte nel modulo imp.

Così, in breve, reload() è stato rimosso prima, poi quando è stato mancato, imp.reload() è stato aggiunto. In realtà non aveva bisogno di essere un built-in, di sicuro lo uso solo di rado.

In Python 3.4 the function was moved a importlib.reload().

+1

Si noti che 'reload' è stato [spostato di recente] (http://bugs.python.org/issue18193) in' importlib', quindi se si sta scrivendo un nuovo codice destinato alle versioni correnti, si dovrebbe usare 'importlib.reload' direttamente su evitare problemi successivi quando la funzione alla fine diventa ufficialmente deprecata e successivamente rimossa. – poke