Maison >développement back-end >Tutoriel Python >Pourquoi les importations relatives échouent-elles en Python lorsqu'un module est exécuté en tant que « __main__ » ?

Pourquoi les importations relatives échouent-elles en Python lorsqu'un module est exécuté en tant que « __main__ » ?

DDD
DDDoriginal
2024-12-19 06:43:10403parcourir

Why Do Relative Imports Fail in Python When a Module is Run as `__main__`?

Importations relatives en Python : une explication détaillée

Lorsque vous travaillez avec un répertoire structuré contenant plusieurs sous-packages, l'importation de modules à partir d'autres sous-packages peut être un problème. exigence commune. Cependant, l'approche standard consistant à utiliser des importations relatives, telles que from ..sub2 import mod2, peut échouer dans certains scénarios.

Ce fut le cas pour un développeur tentant d'importer mod2 depuis mod1, dans la structure de répertoires fournie. dans la question. Le message d'erreur "Tentative d'importation relative dans un non-package" indique un problème avec l'importation relative.

La racine du problème réside dans le fait que le module était exécuté en tant que __main__ en le passant comme argument à l'interprète. Selon PEP 328, les importations relatives utilisent l'attribut __name__ du module pour déterminer sa position dans la hiérarchie des packages. Lorsque le nom du module est défini sur __main__, les importations relatives sont résolues comme si le module était un module de niveau supérieur, quel que soit son emplacement réel dans le système de fichiers.

Ce comportement peut prêter à confusion lors de la tentative d'importation. modules d'autres sous-packages. Pour résoudre ce problème, il est recommandé de placer le code dans un script et d'importer explicitement les sous-packages concernés à l'aide d'importations absolues, telles que import sub2.mod2.

Dans Python 2.6 et versions ultérieures, cependant, la possibilité de référencer des modules par rapport au module principal a été introduit. PEP 366 décrit ce changement. Pour utiliser efficacement les importations relatives, il est essentiel de référencer le module principal au lieu d'utiliser __main__. Ceci peut être réalisé de différentes manières, telles que :

  • __init__.py peut déclarer un attribut __package__ pour attribuer un nom au package contenant.
  • Utiliser la méthode __import__() pour importez le sous-package et affectez-le à une variable.
  • Utilisation d'un module d'espace réservé __init__.py pour déclarer __path__ et __package__, même si le module est vide.

En adoptant ces techniques, les développeurs peuvent utiliser efficacement les importations relatives pour organiser leurs projets Python et gérer les dépendances entre les modules de manière structurée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn