\makeatletter
\@ifundefined{complet}
{\documentclass[10pt]{report}
\title{Python}
\newcommand{\categorie}{Python}
\input{latex_entete_perso}

\begin{document} %Cours

\setcounter{chapter}{32}
% xelatex --shell-escape cours_python
}
{}
\makeatother

\IfFileExists{pubpri.png}{}{\write18{wget https://doc.infoforall.fr/activite/python/images/modules/pubpri.png}}

\IfFileExists{mvc.jpeg}{}{\write18{wget https://doc.infoforall.fr/activite/python/images/pyxel/mvc.jpeg}}




\chapter{Création de modules}




\section{Considérations générales}

\begin{multicols}{2}



\subsection{Fonctions publiques ou privées}

Lorsqu'on réalise un module, on distingue les fonctions publiques (celles que l'utilisateur du module aura le droit d'appeler) et les fonctions privées (celles que l'utilisateur ne pourra pas utiliser lui-même).

\begin{figure}[H]
\centering
\includegraphics[height=4cm]{pubpri.png}
\caption{Publiques, privées}
\label{pub-pri}
\end{figure}



\subsection{Décomposition d'un problème}

On décompose un problème en plusieurs sous-problèmes encapsulés dans des fonctions ne dépassant pas une vingtaine de lignes.

Les foncions simples travaillent sans lancer d'appel à d'autres de vos fonctions.

Les fonctions moyennes lancent des appels aux fonctions simples.

Les fonctions difficiles lancent des appels aux fonctions simples et moyennes pour parvenir à résoudre la tâche qu'on leur demande de réaliser.



\subsection{Données et Interface graphique}

L'une des stratégies du génie logiciele consiste à séparer les fonctions en catégories distinctes :



\begin{itemize}

\item celles du MODELE : elles modifient ou créent les données.

\item celles de la VUE : elles réalisent un affichage et récupèrent les actions de l'utilisateur.

\item celles du CONTROLEUR : elles intègrent la logique du logiciel en faisant notamment la liaison entre VUE et MODELE.

\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[height=6cm]{mvc.jpeg}
\caption{mvc, Source Wikipédia CC BY-SA 4.0}
\label{modèle-vue-contrôleur}
\end{figure}





\subsection{Organisation du .py du module}


Un module suit une organisation précise, comme n'importe quel programme.

\begin{itemize}

\item La \gras{documentation globale} du fichier : intérêt, prototypes des fonctions publiques et quelques exemples d'utilisation initiale, un quickstart.

\item Les \gras{importations}

\item Les déclarations de \gras{CONSTANTES et variables globales} 
    
\item Les déclarations des \gras{fonctions privées} (que l'utilisateur du module ne doit pas utiliser)

\item Les déclarations des \gras{fonctions publiques} (les fonctions librement utilisables)

\item Le programme principal (si besoin)

\item Le \gras{programme de test} : situé dans la conditionnelle indiqué ci-dessous. Ces lignes s'exécutent si on lance le fichier en tant que programme principal. On y place tests et démonstrations de fonctionnement.

\small{
\begin{minted}{python}
if __name__ == '__main__': 
    ...
    ...
    ...
\end{minted}
}


\end{itemize}


\subsection{Désempaquetage / Unpacking}

\small{
\begin{minted}{python}
tup = (10, 20)
a, b = tup
# équivalent à 
a = tup[0]
b = tup[1]
\end{minted}
}



\end{multicols}



\section{Les modules en Python}

\begin{multicols}{2}



\subsection{Création d'un module}

Un module n'est qu'un fichier Python d'extension \fo{.py} accessible depuis un autre fichier Python à l'aide du mot-clé \fo{import}.


\subsection{Utilisation du module}

Pour faire la liaison entre votre fichier Python et votre module, votre module doit être \gras{dans le même répertoire} que votre programme Python. Pour importer un module, on utilise le mot-clé \fo{import}. Il faut retenir qu'on importe ce qui se trouve derrière le mot-clé \fo{import}.

\paragraph{Si on place le nom du module}, on pourra accéder à tout ce que contient le module de cette façon :

\small{
\begin{minted}{python}
import turtle
...
turtle.forward(...)

\end{minted}
}


\paragraph{Si on place une fonction}, on pourra accéder directement à la fonction mais pas au reste du module :

\small{
\begin{minted}{python}
from turtle import forward
...
forward(...)

\end{minted}
}


\subsection{Choisir entre les deux formes}

\paragraph{En NSI} : on privilégie la forme \fo{import module} car nous utilisons souvent plusieurs modules à la fois.


\paragraph{Dans d'autres circonstances} : la forme \fo{from module import fonction} permet d'écrire moins de choses puisqu'on n'a plus besoin de faire précéder la fonction par le nom du module, mais attention au risque de collisions entre plusieurs noms de fonctions identiques dans les différentes modules.

\paragraph{A éviter en NSI} : la forme \fo{from module import *} permet de tout utiliser directement. C'est réellement "dangereux" lorsqu'on importe plusieurs modules. Par contre, si vous n'utilisez que le module \fo{math} par exemple, cela ne pose pas de problème bien entendu.


\subsection{Noms de module et de programme}

Un module est importé en utilisant simplement son nom.

Il faut donc veiller à ne JAMAIS donnez à vos propres programmes des noms correspondant à des modules qui vous connaissez (\fo{random}, \fo{tkinter}, \fo{turtle}...). 

\end{multicols}



\section{Compléments divers}

\begin{multicols}{2}

\subsection{Package}



Un package est donc un \gras{conteneur permettant de stocker des modules}. En Python, la création d'un package contenant un ou plusieurs modules est facile : il suffit

\begin{itemize}

\item de créer un répertoire en lui donnant un nom clair et explicite. Ce nom sera celui du package.

\item de créer dans ce répertoire un fichier-python vide nommé \fo{\_\_init\_\_.py} (pour cela ouvrir Thonny et enregistrer directement ce fichier à l'endroit voulu sous ce nom \fo{\_\_init\_\_.py}.

\item de placer dans ce répertoire le ou les fichiers des modules voulus.

\end{itemize}


\small{
\begin{minted}{bash}
📁 activite
    📄 dessiner.py
    📄 __init__.py
\end{minted}
}

Exemple avec cette configuration :

\small{
\begin{minted}{bash}
from activite.dessiner import triangle
 
informations_feutre = {...}
triangle(...)
\end{minted}
}

Cela veut dire : va dans le package \fo{activite}, trouve le module \fo{dessiner} et ramener l'accès direct à la fonction \fo{triangle}.




\subsection{Bibliothèque}

Une bibliothèque est le nom qu'on donne à un ensemble de modules, que ceux-ci soient encapsulés dans un package, ou pas. Bien entendu, dans 99.9\% des cas, les modules d'une bibliothèque sont transmis sous forme de package plutôt qu'en tant que fichiers indépendants.


\end{multicols}

\input{licence}

\makeatletter
\@ifundefined{complet}
{\end{document}}

{}
\makeatother

