2012-03-13 12 views
19

Zastanawiam się, czy przekazywanie obiektów modułu do klasy lub obiektu, który tego wymaga, a nie używanie import może nie być złym pomysłem, ponieważ pozwala uniknąć trudnych zależności od tych modułów.Python - "importuj" lub przekazuj moduły jako parametry?

Zastanawiam się, czy ktoś bardziej świadomy Zen Python niż ja być w stanie wyjaśnić, dlaczego jest to straszny/nie straszny pomysł?

+0

Wydaje się, że jest to wstrzyknięcie zależne od zależności i tak jak dobry pomysł. Jak często jednak potrzebujesz całego modułu, a nie jednej lub dwóch funkcji/klas? – delnan

Odpowiedz

23

To, o czym mówisz, nazywa się dependency injection i jest uważane za dobrą praktykę w testowaniu kodu. Nie sądzę, że Python ma cokolwiek, co sprawiłoby, że stałoby się ono nietypowe lub złą praktyką.

Istnieją inne sposoby, można to zrobić w Pythonie, na przykład przez importowanie różnych modułów w zależności od jakiejś flagi mijamy w:

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

Ale przechodząc odniesienie do modułu, który chcesz użyć, jest bardziej elastyczny, lepiej oddziela obawy i jest nie mniej Pythoniczny niż przekazywanie odniesienia do klasy lub instancji (lub ciągu lub liczby całkowitej), których chcesz użyć.

Dla zwykłego (non-test) przypadków użycia, można użyć wartości domyślne Argument:

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

Myślę, że to było przeczucie, że usunięcie importu było trochę "złe" – Magnus

3

Jeśli klasa w pytaniu może skorzystać z jednej z kilku różnych modułów, to mogłoby mieć sens, aby przejść w tym, którego chcesz użyć.

W każdej sytuacji, w jakiej do tej pory się spotkałem, potrzebne moduły są jednak pewne, więc preferowane byłoby użycie import.