2012-03-13 22 views
19

Mi chiedevo se passare gli oggetti modulo ad una classe o ad un oggetto che lo richiede piuttosto che usare import potrebbe non essere una cattiva idea, in quanto evita forti dipendenze su quei moduli.Python - 'importa' o passa moduli come parametri?

Mi stavo chiedendo se qualcuno più consapevole dello Zen Python di quanto potrei essere in grado di spiegare perché questa è un'idea terribile/non terribile?

+0

Sembra un'iniezione di dipendenza e in realtà è anche una buona idea. Tuttavia, quanto spesso hai bisogno di un intero modulo, piuttosto che di una o due funzioni/classi? – delnan

risposta

23

Quello di cui parli si chiama dependency injection ed è considerato una buona pratica per rendere verificabile il codice. Non penso che ci sia qualcosa in Python che lo renderebbe unpitonico o una cattiva pratica.

Ci sono altri modi si potrebbe fare in Python, per esempio per l'importazione di moduli diversi a seconda una sorta di bandiera si passa:

class Foo(object): 
    def __init__(self, testing=False): 
     if testing: 
      import module_test as module 
     else: 
      import module 
     self.module = module 

Ma passando un riferimento al modulo che si desidera utilizzare è più flessibile, separa meglio le preoccupazioni e non è meno Pythonic che passare un riferimento a una classe o istanza (o stringa o numero intero) che si desidera utilizzare.

Per l'ordinario caso d'uso (non-test), è possibile utilizzare un valore di argomento di default:

class Foo(object): 
    def __init__(self, module=None): 
     if not module: 
      import module 
     self.module = module 
+0

Immagino che fosse una sensazione che rimuovere le importazioni fosse un po '"sbagliato" – Magnus

3

Se la classe in questione può utilizzare uno dei diversi moduli differenti, allora potrebbe avere senso per passare in quello che vuoi usare.

In ogni situazione che ho incontrato finora, tuttavia, i moduli necessari sono certi, quindi è preferibile utilizzare import.

Problemi correlati