'dal modulo import x, y, z' vs 'dal modulo import *'

2

Uso sempre le importazioni implicite come from module import z, y, z , ma ora ho un progetto, dove tutte le importazioni sono fatte come from module import * e sto cercando di capire, se ci sono dei vantaggi nell'importazione di tutto dall'altro modulo.

Intuitivamente mi sembra un modello molto cattivo e inconsistente, ma forse mi sbaglio? Perché dovrebbe usare from module import * ?

    
posta Paul 28.03.2017 - 09:51
fonte

1 risposta

10

Quando fai from my_module import * significa che tutte le funzioni e le dichiarazioni di classe di my_module sono disponibili. Questo è l'unico vantaggio per farlo.

Ci sono alcuni avvertimenti da considerare:

Devi sapere cosa c'è nell'altro modulo per sapere cosa viene importato

Se non sai quali funzioni o classi ci sono nel tuo 'my_module', devi andare a leggere questo modulo, mentre non intrinsecamente male. I nuovi membri del progetto potrebbero essere confusi e se torni al tuo codice 6 mesi dopo, potresti non essere completamente a conoscenza di ciò che viene effettivamente importato.

La chiarezza è la chiave

from my_reader import * è meno chiaro di from my_reader import file_reader

Rischi di creare collisioni nelle importazioni

Se dichiari una funzione o una classe con lo stesso nome in due moduli diversi e importi entrambi nello stesso file, ciò causerà problemi. L'importazione con nome consente di sovrascrivere il nome all'importazione

Ad esempio:

from file_reader import read as read_file
from web_reader import read as read_website

Questo è un metodo molto più sicuro di

Conoscere le tue dipendenze

Quando importi solo le funzioni e le classi di cui hai bisogno, sai esattamente su cosa dipende il modulo su cui stai lavorando. E con gli strumenti puoi creare questi grafici delle dipendenze, se necessario.

Quando i moduli cambiano il peggio è ImportError

Il pericolo di non sapere cosa viene raccolto in quella stella, è quando una funzione o una classe viene spostata da un modulo a un'altra. Il compilatore non ti aiuterà quando hai una stella. Si otterrebbe un errore indefinito, che è miglia più confuso di ImportError, che è più facile da rintracciare.

Consigli

Se vuoi accedere a qualsiasi parte del modulo è probabilmente meglio usare import my_module su from my_module import * . Puoi accedere a qualsiasi funzione o oggetto di my_module utilizzando la seguente sintassi:

my_module.my_awesome_function()
my_object = my_module.MyObject()

L'unico svantaggio è che è leggermente più lungo ma fornirà errori migliori. È ancora meglio decidere questo stile per il tuo progetto. Ma considera di applicare un po 'di codice pulito e di offrire buone strategie di debug in caso di errori dello sviluppatore.

    
risposta data 28.03.2017 - 11:46
fonte

Leggi altre domande sui tag