Maison >développement back-end >Tutoriel Python >Solution pour dupliquer les noms des modules et packages Python

Solution pour dupliquer les noms des modules et packages Python

Y2J
Y2Joriginal
2017-05-13 13:43:299343parcourir

Cet article vous présente principalement la méthode de gestion des modules et des packages du même nom en Python. L'introduction dans l'article est très détaillée et a une certaine valeur de référence et d'apprentissage pour tous les amis qui en ont besoin peuvent y jeter un œil ci-dessous. .

Préface

Dans le développement de la programmation, je pense personnellement que tant que vous suivez les spécifications, il y aura quelques problèmes. Lorsque vous débutez l’apprentissage d’une technologie, vous rencontrerez en effet de nombreux écueils. C’est une bonne chose que vous ayez affronté davantage d’embûches. Vous en apprendrez davantage et vous ressentirez de plus en plus l’importance de suivre les règles. Les règles sont formulées pour éviter les problèmes. Parfois, il vaut vraiment la peine d’écouter les conseils de personnes expérimentées et de ne pas suivre son propre chemin. Cela ne semble pas être l'objet de cet article. En fait, mon objectif est d'exprimer que nous devrions faire de notre mieux pour faire les choses selon les normes, afin d'éviter de nombreux détours.

Le principal langage de programmation que j'utilise maintenant est Python Jusqu'à présent, j'ai l'impression d'avoir rencontré très peu d'embûches depuis que je suis entré en contact avec Python, et fondamentalement je n'ai rencontré aucun problème étrange. problèmes. En fait, ce n’est pas une bonne chose. Si vous ne tombez pas dans le piège, vous ne comprendrez pas beaucoup de points de connaissance qui se trouvent dans le noir, il sera donc difficile de grandir. Heureusement, certains collègues savent tomber dans le piège.

Un collègue m'a demandé, en Python, si un module et un package ont le même nom, seul le package peut-il être importé ? Que dois-je faire si je souhaite importer le module ? Ce qu'il veut dire, c'est probablement ceci. Dans le même répertoire du projet, il y a un fichier foo.py et un répertoire foo/. Si import foo est importé, le contenu de foo/ sera importé à la place du contenu de foo.py. .

Quand on m'a posé cette question, la première chose que j'ai ressentie a été la surprise. Il y avait évidemment une ambiguïté. Si c'était moi, je ne concevrais certainement pas le nom du module et le nom du package comme étant identiques, car il n'y a essentiellement aucun moyen de distinguer qui importer lors de l'importation. Sauf dispositions particulières du système, par exemple, il est précisé que seuls les colis peuvent être importés dans ce cas.

Je pense inconsciemment qu'une erreur devrait être signalée ici, car l'interpréteur Python ne sait pas qui importer. Cependant, un collègue m'a dit que le code d'autres personnes est écrit comme ceci et que dans ce cas, le package sera importé par défaut. C'est possible, et l'interprète a précisé que le package sera toujours importé dans ce cas.

Afin de vérifier cela, j'ai écrit un projet simple avec la structure de projet suivante :


.
├── main.py
└── same
 ├── api
 │ └── init.py
 ├── auth
 │ └── init.py
 ├── auth.py
 └── init.py

Parmi eux :

same/api/init/py Contenu :


from .. import auth

same/auth/init.py Contenu de :


auth_str = "This is str in package!"

same/auth.py Contenu :


auth_str = "This is str in module!"
Contenu de

main.py :


from future import print_function

from same.api import auth

# Script starts from here

if name == "main":
 print(auth.auth_str)

C'est un peu compliqué, haha, principalement parce que la structure générale de mes collègues est comme ça, la voici pour mieux comprendre Simuler. J'ai défini une chaîne same.auth auth_str dans le package , et défini une chaîne same.auth du même nom dans le module auth_str du même nom, puis j'ai essayé de l'importer dans le same.api package auth, et enfin essayez d'afficher same.api.auth.auth_str dans main.py pour voir quelle chaîne sera imprimée. Essayez d'exécuter main.py avec Python2 et Python3 en même temps, et les résultats obtenus sont :


This is str in package!

Cela vérifie que notre conjecture est correcte, et l'interprète n'importe que le contenu du package. Cependant, je ne sais pas s'il existe des informations officielles indiquant que c'est le cas, donc je ne suis pas sûr qu'il s'agisse simplement d'une coïncidence.

J'ai donc commencé à rechercher des informations pour vérifier cette conclusion. Permettez-moi d'être honnête. Pour quelqu'un dont l'anglais est si mauvais que vous ne pouvez même pas l'imaginer, je ne peux d'abord qu'essayer de chercher la réponse sur Baidu. Le fait est que l’utilisation de Baidu est souvent dommage. Au bout d’un moment, en vain, je n’ai eu d’autre choix que de mordre la balle et d’essayer de chercher en anglais. J'ai donc trouvé la question suivante sur stackoverflow :

Comment Python traite les modules et packages portant le même nom ?

L'un d'eux a répondu que la documentation officielle de Python le mentionne lors de la description du chemin de recherche du module À ce stade : docs.python.org/3/tutorial/modules.html#the-module-search-path.

Le document a la description suivante :

Après l'initialisation, les programmes Python peut modifier sys.path. Le répertoire contenant le script en cours d'exécution est placé au début du chemin de recherche, avant le chemin standard de la bibliothèque. Cela signifie que les scripts de ce répertoire seront chargés à la place des modules du même nom dans la bibliothèque. répertoire. Il s'agit d'une erreur à moins que le remplacement ne soit prévu. Voir la section Modules standards pour plus d'informations.

En d'autres termes, le répertoire sera recherché en premier sous le chemin de recherche de la bibliothèque, ce qui signifie que le répertoire. Sera chargé à la place du module du même nom.

Je suis enfin soulagé maintenant que ma conclusion précédente a été confirmée. En Python, si vous essayez d'importer un module ou un package portant le même nom, le package sera importé. Dans ce cas, si vous souhaitez importer le module, vous devrez peut-être utiliser des méthodes de « hack ». Il y a quelques exemples dans l'article stackoverflow mentionné ci-dessus. Bien sûr, le meilleur moyen est d’éviter une telle conception, afin de ne pas passer autant de temps à rechercher des informations et de ne pas passer autant de temps à écrire des articles similaires à celui-ci.

Résumé

[Recommandations associées]

1. 🎜>Spécialement recommandé : Téléchargement de la version "php Programmer Toolbox" V0.1

2.

Tutoriel vidéo gratuit Python3

Tutoriel vidéo orienté objet Python

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