2013-02-20 10 views
6

Sto lavorando su Python 2.6/2.7 del codice che contiene i seguenti:Python: può __file__ essere None se l'importazione è riuscita?

try: 
    import gmpy 
    gmpy_imported=True 
except ImportError: 
    gmpy_imported=False 

if gmpy_imported and gmpy.__file__ is None: 
    gmpy_imported=False 

posso capire la parte try-except, che viene utilizzato per vedere se gmpy è stato installato sul sistema - e se no, a fare qualsiasi cosa. Tuttavia, non capisco perché sia ​​necessario il controllo if gmpy.__file__ is None; sembra ridondante.

Ci sono circostanze in cui l'importazione di un pacchetto sembra essere riuscita, ma il percorso del pacchetto sarebbe di fatto vuoto? Si tratta di un doppio controllo di sicurezza contro un'installazione danneggiata?

+0

Se questo è Python 3.2+, il codice relativo all'importazione è in realtà leggibile abbastanza da consentirci di esaminarlo e vedere se una cosa del genere potrebbe mai accadere. Ma non credo che vorrei provarlo con il vecchio codice ... – abarnert

+0

No, è Python 2. Avrei dovuto chiarirlo nella domanda ... – Boris

risposta

2

Non ha senso in questo assegno. Se il modulo/pacchetto fosse stato importato con successo, __file__ non sarebbe mai nessuno, sarebbe il percorso del modulo.

+0

Questo è quello che stavo pensando anch'io ... dedicare ancora un po 'di tempo a questo problema, perché mi piacerebbe saperne di più. – Boris

2

I documenti dicono "L'attributo __file__ non è presente per i moduli C che sono collegati staticamente all'interprete", quindi credo che sia ridondante. Inoltre, che differenza farebbe, l'oggetto modulo è lì.

+1

"non presente" non è uguale a "Nessuno". – interjay

+0

@interjay: vero. Detto questo, i documenti non definiscono alcun caso in cui sarebbe presente e impostato su "Nessuno" - che rafforza la mia affermazione che è ridondante. – martineau

+0

+1. Ma se i documenti sembrano dire che questo non dovrebbe mai accadere, eppure qualcuno ha scritto il codice ... come facciamo a sapere che non è, ad esempio, "ricontrollare un failsafe contro un'installazione danneggiata", come suggeriva l'OP , senza leggere il codice di importazione (o tentare di creare una suite di test, o indovinare in base a ciò che sappiamo sulla conoscenza della persona che ha scritto il codice dell'OP, o ...)? – abarnert

Problemi correlati