byłbym wstrząśnięty, aby dowiedzieć się, że jest to najlepszy sposób to zrobić ... Jednakże, ponieważ wczesne wersje python2.x, małpa łatanie __import__
została poparta. Możemy skorzystać z tego tutaj:
try:
import builtins # python3.x
except ImportError:
import __builtin__ as builtins # python2.x
import sys
import collections
_builtin_import = builtins.__import__
def _my_import(name, globals=None, locals=None, fromlist=(), level=0):
already_imported = name in sys.modules
mod = _builtin_import(
name,
globals=globals,
locals=locals,
fromlist=fromlist,
level=level)
if not already_imported and name in _post_import_hooks:
for hook in _post_import_hooks[name]:
hook()
return mod
builtins.__import__ = _my_import
_post_import_hooks = collections.defaultdict(list)
def on_import(name):
def decorator(func):
_post_import_hooks[name].append(func)
return func
return decorator
@on_import('numpy')
def print_hi():
print('Hello Numpy')
print('before numpy')
import numpy
print('after numpy')
Ta odpowiedź sprawia super- prosty rejestr rejestrowania wywołań zwrotnych. Dekorator właśnie rejestruje funkcję, a następnie ją zwraca. Nie sprawdza on wcale, czy moduł jest już załadowany, na przykład), ale można go łatwo rozszerzyć.
Oczywiście wadą jest to, że jeśli jakiś inny moduł zdecyduje się na patch małpki __import__
, to masz pecha - albo ten moduł, albo ten drugi, prawdopodobnie się zepsuje.
Testowałem to i wygląda na to, że działa zarówno na python2.x jak i python3.x.
Czy możesz dodać kod na samym końcu modułu? – BallpointBen
Nie, chcę to zrobić dla modułów, których nie posiadam (szczególnie [numpy] (http://www.numpy.org)). –
Czy musi to być zaraz po imporcie, czy może to być przed kodem głównym? –