2009-07-29 11 views
11

Supponiamo che io ho la seguente struttura:Importazione di file in Python da __init__.py

app/ 
    __init__.py 
    foo/ 
    a.py 
    b.py 
    c.py 
    __init__.py 

a.py, b.py e c.py condivido alcune importazioni comuni (logging, os, re, ecc). È possibile importare questi tre o quattro moduli comuni dal file __init__.py in modo da non doverli importare in ognuno dei file?

Modifica: il mio obiettivo è evitare di importare 5-6 moduli in ogni file e non è correlato a motivi di prestazioni.

+0

Se si desidera eseguire questa operazione per motivi di prestazioni, non preoccuparti: l'importazione di moduli già caricati è super veloce (una semplice ricerca dict su sys.modules). – efotinis

+0

Domanda modificata per chiarire le mie motivazioni. –

+1

L'obiettivo dichiarato riduce la leggibilità del codice, non credi? – Santa

risposta

11

No, devono essere inseriti nello spazio dei nomi di ogni modulo, quindi è necessario importarli in qualche modo (a meno che non si passi a logging come argomento di funzione, che sarebbe un modo strano di fare le cose, per usare un eufemismo).

Ma i moduli vengono importati solo una volta in ogni caso (e poi messo nelle a, b, e c spazi dei nomi), quindi non preoccupatevi di usare troppa memoria o qualcosa del genere.

Naturalmente, è possibile metterli in un modulo separato e importare che in ciascuna a, b, e c, ma questo modulo separato dovrebbe ancora essere importati ogni volta.

13

È possibile farlo utilizzando un file comune come include.py, ma va contro le pratiche raccomandate perché implica un'importazione di caratteri jolly. Prendere in considerazione i seguenti file:

app/ 
    __init__.py 
foo/ 
    a.py 
    b.py 
    c.py 
    include.py <- put the includes here. 
    __init__.py 

Ora, in a.py, ecc, fare:

from include import * 

Come detto sopra, non è consigliabile perché jolly-importazioni sono scoraggiati.

+7

+1 per i caratteri jolly. Una coerenza sciocca è la follia delle piccole menti. L'incapacità di raggruppare le importazioni correlate sensibilmente è una verruca di pitone; quindi, deve cedere al carattere jolly. – g33kz0r

6

Sì, ma non farlo. Seriamente, no. Ma se si vuole ancora sapere come farlo, sarebbe simile a questa:

import __init__ 

re = __init__.re 
logging = __init__.logging 
os = __init__.os 

dico di non farlo, non solo perché è disordinato e inutile, ma anche perché il pacchetto non è realmente suppone usare __init__.py così. È il codice di inizializzazione del pacchetto.

+0

Non direi che è inutile. Alcune cose che desideri applicare a tutto il tuo codice, ad es. 'dal futuro import unicode_literals'. Devo davvero metterlo in ogni file (e poi dimenticarne alcuni, risultando in bug difficili da trovare)? – Timmmm

Problemi correlati