Jest to skomplikowany i mylący problem. Metoda, którą daję, przeładuje moduł i odświeży zmienne w danym kontekście. Jednak ta metoda zostanie przewrócona, jeśli masz wiele modułów używających oznaczonego gwiazdką importu dla danego modułu, ponieważ zachowają one swoje pierwotne wartości zamiast aktualizować. Ogólnie rzecz biorąc, nawet przeładowanie modułu jest czymś, czego nie powinieneś robić, z wyjątkiem sytuacji, gdy pracujesz z REPL. Moduły nie są czymś, co powinno być dynamiczne. Powinieneś rozważyć inne sposoby dostarczania potrzebnych aktualizacji.
import sys
def reload_starred(module_name, context):
if context in sys.modules:
context = vars(sys.modules[context])
module = sys.modules[module_name]
for name in get_public_module_variables(module):
try:
del context[name]
except KeyError:
pass
module = reload(module)
context.update(get_public_module_variables(module))
def get_public_module_variables(module):
if hasattr(module, "__all__"):
return dict((k,v) for (k,v) in vars(module).items()
if k in module.__all__)
else:
return dict((k,v) for (k,v) in vars(module).items()
if not k.startswith("_"))
Zastosowanie:
reload_starred("my_module", __name__)
reload_starred("my_module", globals())
reload_starred("my_module", "another_module")
def function():
from my_module import *
...
reload_starred("my_module", locals())
To jeszcze jeden powód, aby nie używać importu oznaczone gwiazdką. – vaultah
Może możesz spróbować z samym modułem sys. Wyświetlanie wszystkich załadowanych modułów (sys.moduled.keys()) i ponowne ich importowanie (po oczyszczeniu -> sys.modules.clear()) –
@vaultah: Nie rozumiem, co próbujesz powiedzieć. Ten import z oznaczeniem gwiazdowym jest złym pomysłem, dlatego też Python nie daje możliwości ponownego załadowania importowanych gwiazd, mimo że Python zezwala na importowanie z gwiazdką w pierwszej kolejności. Czy istnieje nieodpowiednia przyczyna tej asymetrii? –