Rekurencyjna wersja „przeładowania”
Kiedy tworzę kod Pythona, zwykle testuję go w tłumaczeniu ad hoc. Choryimport some_module
, przetestuj go, znajdź błąd, napraw błąd i zapisz, a następnie użyj wbudowanegoreload
funkcja doreload(some_module)
i powtórz test.
Przypuśćmy jednak, że wsome_module
mamimport some_other_module
i podczas testowaniasome_module
Odkryłem błąd wsome_other_module
i napraw to. Teraz dzwonięreload(some_module)
nie będzie rekurencyjnie ponownie importowaćsome_other_module
. Muszę albo ręcznie zaimportować zależność (wykonując coś podobnego)reload(some_module.some_other_module)
lubimport some_other_module; reload(some_other_module)
lub, jeśli zmieniłem całą masę zależności i straciłem kontrolę nad tym, co muszę przeładować, muszę zrestartować cały interpreter.
Co byłoby wygodniejsze, gdyby były jakieśrecursive_reload
funkcja, a ja mógłbym to zrobićrecursive_reload(some_module)
i mieć Pythona nie tylko przeładowaćsome_module
, ale także rekursywnie przeładowuj każdy modułsome_module
importuje (i każdy moduł, który importuje każdy z tych modułów itd.), dzięki czemu mógłbym być pewien, że nie używam starej wersji żadnego z pozostałych modułów, na którychsome_module
zależy.
Nie sądzę, żeby w Pythonie było coś wbudowanego w to, co zachowuje się jak wrecursive_reload
opisuję tutaj funkcję, ale czy istnieje łatwy sposób na włamanie się do czegoś takiego?