Sto scrivendo un pezzo di software su github. È fondamentalmente un'icona di vassoio con alcune funzionalità extra. Voglio fornire un pezzo di codice funzionante senza dover effettivamente installare l'utente quali sono essenzialmente le dipendenze per le funzionalità opzionali e in realtà non voglio importare cose che non userò, quindi ho pensato che un codice come questo sarebbe stato " buona soluzione ":Qual è la buona pratica di Python per l'importazione e l'offerta di funzionalità opzionali?
Ci sono alcuni problemi tuttavia. Se un utente formatta la sua macchina e installa la versione più recente del suo sistema operativo e ridistribuisce questa applicazione, le funzionalità scompaiono improvvisamente senza preavviso. La soluzione è quella di presentare questo nella finestra di configurazione:
if 'pynotify' in features:
#gtk checkbox
else:
#gtk label reading "Get pynotify and enjoy notification pop ups!"
Ma se questo è dire, un mac, come faccio a sapere che non mando l'utente su un inseguimento oca selvatica in cerca di una dipendenza non possono mai riempire?
Il secondo problema è il: problema
if os.path.exists(os.path.join(path, 'gnomekeyring.so')):
. Posso essere sicuro che il file sia sempre chiamato gnomekeyring.so attraverso tutte le distro di Linux?
In che modo altre persone verificano queste funzionalità? Il problema con la base
try:
import pynotify
except:
pynotify = disabled
è che il codice è globale, questi potrebbero essere disseminato in giro e anche se l'utente non vuole pynotify .... è caricato in ogni caso.
Quindi cosa pensa la gente è il modo migliore per risolvere questo problema?
Penso che il blocco 'except ImportError' deve impostare' external_module = None' o si otterrà un 'NameError' quando si tenta di accedervi nel blocco if. – abhishekmukherg
Molto simile, prova: tranne: (senza tipo di eccezione), è un Anti-pattern, che cattura ImportError potrebbe non essere quello che vuoi. Se il modulo esiste, ma solleva un'eccezione, lo prendi e continua, nascondendo l'errore. È molto meglio prima verificare l'esistenza del modulo, decidere se si desidera importarlo e quindi * non * gestire l'ImportError – user48956