2013-10-29 13 views
8

Zbudowałem moduł, który używa kilku różnych modułów do różnych zadań. Kiedy importuję mój moduł do IPython i listę dostępnych funkcji autouzupełniania, te zewnętrzne moduły są zawarte na tej liście. Czy można je w jakiś sposób ukryć?Ukryj importowane moduły do ​​interpretera

+0

AFAIK nie, ale nie jestem ekspertem ipython. Brzydkim sposobem obejścia problemu jest utworzenie nowego modułu, w którym zaimportujesz * to, co chcesz * z modułu, o którym wspomniałeś, a następnie użyjesz tego nowego modułu zamiast drugiego. Jeszcze innym sposobem jest zmiana nazwy 'import's. Na przykład, jeśli użyjesz 'moduleA' jako pomocnika, wykonaj' import moduleA jako _moduleA'. Wtedy autouzupełnianie będzie problemem tylko wtedy, gdy próbujesz uzyskać dostęp do atrybutu zaczynającego się od '_'. – Bakuriu

Odpowiedz

8

W Pythonie moduły można zdefiniować __all__ zmienną, która jest lista nazw, które powinny być importowane, gdy ktoś robi:

from module import * 

ipython można użyć tej samej zmiennej w celu ograniczenia uzupełnienia, choć nie rób to domyślnie. Aby umożliwić to w czasie wykonywania ustaw:

get_ipython().Completer.limit_to__all__ = True 

lub ustawić go na stałe, dodać do ipython_config.py:

c.IPCompleter.limit_to__all__ = True 
+0

Dzięki za odpowiedź na tak stare pytanie (według standardów internetowych)! –

+0

Dlaczego IPython nie robi tego domyślnie? Po prostu ciekawy - założę się, że istnieje dobry powód i jestem ciekawy. –

+1

Głównie dlatego, że '__all__' często nie jest utrzymywany bardzo dobrze, i w przeciwieństwie do prefiksowanych _ _' prywatnych elementów (domyślnie ukrytych), nie ma jasnego sposobu na żądanie brakujących elementów bez ponownego uruchamiania ze zmienioną konfiguracją. Możesz zobaczyć łatkę [tutaj] (https://github.com/ipython/ipython/pull/1529) i dalej dyskusję [tutaj] (https://github.com/ipython/ipython/pull/1497). – minrk

Powiązane problemy