Questo costrutto lacerato lo rende molto difficile, per la persona povera che legge il codice (spesso in un tentativo fallito di aiutarlo a debuggarlo) per capire da dove provengono nomi misteriosi - impossibile, se il costrutto viene usato di più di una volta a livello lessicale; ma anche se usato una sola volta, costringe a rileggere laboriosamente l'intero modulo ogni volta prima che uno possa convincersi che, sì, quel barname in disordine deve provenire dal modulo.
Inoltre, gli autori dei moduli di solito non vanno nei guai estremi necessari per "supportare" l'odioso costrutto in questione. Se da qualche parte nel tuo codice hai, per esempio, un uso di sys.argv
(e uno import sys
nella parte più alta del tuo modulo, ovviamente), come fai a sapere che sys
è il modulo che dovrebbe essere ... o alcuni completamente diverso uno (o un non modulo) proveniente dallo ... import *
?!Moltiplicate quello con tutti i nomi qualificati che state usando e la miseria è l'unico risultato finale - quello, e misteriosi bug che richiedono un debug lungo e laborioso (di solito con l'aiuto riluttante di qualcuno che fa "get" Python ... ! -).
All'interno di una funzione, un modo per aggiungere e ignorare nomi locali arbitrari sarebbe anche peggio. Come elementare ma cruciale ottimizzazione, il compilatore Python controlla il corpo della funzione per qualsiasi assegnazione o altre istruzioni di binding su ogni barename, e considera "local" quei nomi che vede così assegnati (gli altri devono essere globali o built-in). Con un import *
(proprio come con un exec somestring
senza dict esplicito da utilizzare come spazi dei nomi), improvvisamente diventa un mistero totale quali nomi sono locali, quali nomi sono globali, quindi il compilatore povero dovrebbe ricorrere alla strategia più lenta possibile per ogni ricerca del nome, usando un dict per le variabili locali (invece del "vettore" compatto che normalmente utilizza) e eseguendo fino a tre ditt di look-up per ogni barename a cui si fa riferimento, più e più volte.
Passare a qualsiasi prompt interattivo Python. Digitare import this
. Cosa vedi? Lo Zen di Python. Qual è l'ultimo e probabilmente il più grande pezzo di saggezza in quel testo ...?
Gli spazi dei nomi sono una delle grandi idee - facciamolo di più!
Forzando l'uso di barenames cui nomi qualificati sono così di gran lunga preferibile, si sta essenzialmente facendo il contrario di questo saggio raccomandazione molto : invece di ammirare la grandezza e honkingtude di spazi dei nomi, e fare di più di quelli, sei che scompone due spazi dei nomi perfettamente funzionanti e pronti per l'uso (quello del modulo che stai importando e quello dell'ambito lessicale in cui lo stai importando) per creare un singolo, empio, caos buggy, lento, rigido, inutilizzabile.
Se potessi tornare indietro e cambiare uno decisione di progettazione iniziale in Python (si tratta di una scelta difficile, perché l'uso di def
e soprattutto per quello che lambda
Javascript così chiama molto di più essere letti function
è un secondo vicino ;-), Vorrei cancellare retroattivamente l'idea di import *
dalla mente di Guido. Nessuna quantità di presunta convenienza per l'esplorazione al prompt interattivo in grado di bilanciare la quantità del male è battuto ... -!)
quale ID si sta utilizzando e quale avviso? – avi
Ho scritto un post sul blog che spiega perché questo deve essere vietato nell'ambito non globale: https://www.lesinskis.com/TIL_python_imports.html – shuttle87