Je maintiens un paquetage python dans lequel j'ai fait quelques restructurations. Maintenant, je veux soutenir les clients qui font encore du from my_package.old_subpackage.foo import Foo
au lieu de la nouvelle from my_package.new_subpackage.foo import Foo
sans réintroduire explicitement de nombreux fichiers qui effectuent le transfert. ( old_subpackage
existe toujours, mais ne contient plus de foo.py
.)
J'ai appris qu'il existe des "loaders" et des "finders", et j'ai eu l'impression que je devais mettre en œuvre un "loader". chargeur pour mes besoins, mais je n'ai réussi à mettre en œuvre qu'un chercheur jusqu'à présent :
RENAMED_PACKAGES = {
'my_package.old_subpackage.foo': 'my_package.new_subpackage.foo',
}
# TODO: ideally, we would not just implement a "finder", but also a "loader"
# (using the importlib.util.module_for_loader decorator); this would enable us
# to get module contents that also pass identity checks
class RenamedFinder:
@classmethod
def find_spec(cls, fullname, path, target=None):
renamed = RENAMED_PACKAGES.get(fullname)
if renamed is not None:
sys.stderr.write(
f'WARNING: {fullname} was renamed to {renamed}; please adapt import accordingly!\n')
return importlib.util.find_spec(renamed)
return None
sys.meta_path.append(RenamedFinder())
https://docs.python.org/3.5/library/importlib.html#importlib.util.module_for_loader et les fonctionnalités qui y sont liées semblent toutefois être obsolètes. Je sais que ce n'est pas très pythonique ce que j'essaie de faire, mais je serais heureux d'apprendre que c'est réalisable.