Les modules et packages en Python sont des "espaces de noms"

Motivation pour écrire cet article

Je vous serais reconnaissant de bien vouloir me faire savoir s’il existe quelque chose comme «Ecrivez correctement cet article ou document».

Inconvénients de la séparation des fichiers par classe

Dans les langages tels que Java et C # qui sont contraints par l'orientation objet, je pense qu'il est habituel d'écrire une classe publique par fichier.

Mais en python, ~ .py sont tous des modules, et les modules sont un ensemble de fonctionnalités qu'ils fournissent. Je pense que le module peut avoir plusieurs classes.

Par exemple, dans les models.py de Django (le module par défaut qui implémente la classe d'entité ORM), c'est une image d'écriture de toutes les classes d'entités dans une ligne.

models.py


from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Extrait de "Créer votre première application Django, partie 2"

Il peut être rare dans la pratique que ce nombre de lignes corresponde, mais est-il si avantageux de séparer une classe d'au plus quelques lignes dans un fichier séparé? Bien sûr, si la langue change, le sens commun change également. Je pense que c'est différent de traiter 1 fichier de classe 1 comme spécifié en python.

La principale raison pour laquelle je ressens cela est que cela affecte la façon dont j'écris «import».

Importation de module lorsque 1 fichier de classe 1

Par exemple, si la configuration est la suivante

polls/models/
 ├─ __init__.py
 ├─ question.py ...Seule la question est définie
 └─ choice.py   ...Seul le choix est défini

Pour appeler chaque classe, écrivez:

from polls.models.question import Question
from polls.models.choice import Choice
question = Question()
choice = Choice()

Alternativement, vous pouvez écrire:

from polls import models
question = models.question.Question()
choice = models.choice.Choice()

Vous avez créé un espace de noms dédié pour chaque classe, n'est-ce pas? Je me sens exagéré.

Lorsque toutes les classes sont dans un module

Il a la même structure que le tutoriel.

polls/models.py

Pour appeler la classe, écrivez:

from polls.models import Question, Choice
question = Question()
choice = Choice()

Ou vous pouvez tout importer en utilisant *.

from polls.models import *
question = Question()
choice = Choice()
#Ce n'est pas explicite où et ce que vous avez importé, c'est donc une autre question que vous l'utilisiez ou non.

Je pense que c'est une structure simple où Question``Choice vit dans l'espace de noms polls.models.

Raisons d'utiliser les packages

Alors pourquoi y a-t-il une fonction appelée package? Par exemple, les raisons suivantes sont possibles

Si cela se produit, la visibilité sera pire si vous n'utilisez pas le package et vous ne pourrez pas garder les choses organisées. Utilisons des packages pour séparer les modules. Je pense qu'il est nécessaire de réfléchir à la manière de découper un module dans un package à chaque fois, en fonction de la destination du package.

La seule chose importante est que ** l'importateur devrait pouvoir y accéder comme s'il s'agissait d'un seul module **.

__Init __. Py pour cela

Par exemple, sur la base de l'exemple du didacticiel précédent (qui n'est peut-être pas très courant), disons que chaque classe est devenue gonflée et que des fonctions d'assistance qui ne sont utilisées que dans les modèles sont apparues, les fichiers sont donc divisés en packages.

polls/models/
 ├─ __init__.py
 ├─ question.py ...La question est définie
 ├─ choice.py   ...Le choix est défini
 └─ helper.py   ...La fonction de commodité est définie

À ce rythme, si vous voulez appeler Question, vous devez écrire depuis polls.models.question import Question. En d'autres termes, la manière d'écrire l'importation changera par rapport à celle d'un seul fichier. S'il s'agissait d'une bibliothèque, ce serait un changement catastrophique affectant l'interface.

Par conséquent, ajoutez ce qui suit au toujours vide «__init __. Py». Il est pratique d'écrire le module cible à partir de . car il devient une référence relative.

polls/models/__init__.py


from .question import Question
from .choice import Choice
# (Je n'écris pas d'aide car il n'est utilisé qu'en interne)

En écrivant ceci, vous pouvez clairement indiquer que " Question Choice est dans l'espace de noms polls.models!", Et vous pouvez écrire import tel quel.

from polls.models import Question, Choice
question = Question()
choice = Choice()

Autrement dit, ** les modules et packages sont des espaces de noms **

―― Je veux que la granularité de l'espace de noms soit appropriée, et c'est un peu étrange de définir un espace de noms pour une seule classe.

Bien entendu, certaines bibliothèques sont conçues pour faire directement référence aux modules du package. Probablement une énorme bibliothèque comme un framework. Même ainsi, les packages finaux sont organisés en pensant à l'utilisateur. Il peut être utile de lire ce code.

Recommended Posts

Les modules et packages en Python sont des "espaces de noms"
Paquets et modules Python
Organisez les modules et les packages Python dans le désordre
Apprenez à connaître les packages et les modules Python
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Cours de base Python (14 modules et packages)
nest cog dans discord.py
Les modules et packages en Python sont des "espaces de noms"
Résumé des modules et des classes dans Python-TensorFlow2-
Ecrire un module python dans fortran en utilisant f2py
Pile et file d'attente en Python
Unittest et CI en Python
Obtenez une compréhension abstraite des modules et des packages Python
Liste des informations sur les arguments de méthode pour les classes et les modules en Python
Un moyen standard de développer et de distribuer des packages en Python
Introduction à la vérification des effets Rédaction des chapitres 4 et 5 en Python
Différence entre list () et [] en Python
Différence entre == et est en python
Afficher les photos en Python et html
Algorithme de tri et implémentation en Python
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
A propos des modules Python Primer et des expressions conditionnelles
Affectations et modifications des objets Python
[Python] Que sont @classmethod et les décorateurs?
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Hashing de données en R et Python
Synthèse de fonctions et application en Python
Exporter et exporter des fichiers en Python
Inverser le pseudonyme plat et le katakana en Python2.7
Lire et écrire du texte en Python
[GUI en Python] Menu PyQt5 et barre d'outils-
Créer et lire des paquets de messages en Python
Expressions régulières faciles et solides à apprendre en Python
Téléchargez et gérez les packages qui ne sont pas dans conda sur anaconda.org
Chevauchement d'expressions régulières en Python et Java
Différence d'authenticité entre Python et JavaScript
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Évitez les boucles imbriquées en PHP et Python
Différences entre Ruby et Python dans la portée
Modulation et démodulation AM avec Python Partie 2
différence entre les instructions (instructions) et les expressions (expressions) en Python
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
Environnement virtuel Python et packages sur Ubuntu
Module d'implémentation de file d'attente et Python "deque"
Graphique à lignes pliées et ligne d'échelle en python
[Python] Empaquetez et distribuez vos propres modules
Implémenter le filtre FIR en langage Python et C
Différences entre la syntaxe Python et Java
Vérifier et recevoir le port série en Python (vérification du port)
Rechercher et lire des vidéos YouTube avec Python
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Ecrire le fichier O_SYNC en C et Python
Gérer les "années et mois" en Python
Lire et écrire des fichiers JSON avec Python
Représentez facilement des données graphiques dans le shell et Python
Méthodes et champs privés en python [chiffrement]
Rechercher et vérifier la matrice inverse en Python
Indépendance et base linéaires: Algèbre linéaire en Python <6>
Appelez sudo en Python et mot de passe à saisie automatique
Résumé des modules et des classes dans Python-TensorFlow2-