relecture de la formation
This commit is contained in:
parent
62b57d9dfb
commit
3569c00af1
|
@ -3,7 +3,7 @@ Programmation python courante
|
||||||
|
|
||||||
.. _namespaces:
|
.. _namespaces:
|
||||||
|
|
||||||
les espaces de nommage
|
Les espaces de nommage
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Packages et modules::
|
Packages et modules::
|
||||||
|
@ -15,9 +15,9 @@ Packages et modules::
|
||||||
__init__.py
|
__init__.py
|
||||||
module2.py
|
module2.py
|
||||||
|
|
||||||
A utilser pour organiser votre projet
|
À utilser pour organiser votre projet.
|
||||||
Permet de minimiser les risques de conflits de nome
|
Permet de minimiser les risques de conflits de nom.
|
||||||
Permet de diminuer les entrées dans le :envvar:`PYTHONPATH`
|
Permet de diminuer les entrées dans le :envvar:`PYTHONPATH`.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
|
@ -35,31 +35,31 @@ Permet de diminuer les entrées dans le :envvar:`PYTHONPATH`
|
||||||
|
|
||||||
from os import *
|
from os import *
|
||||||
|
|
||||||
lance un module en tant que script :
|
Lancer un module en tant que script :
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
||||||
Organisation modulaire
|
Organisation modulaire :
|
||||||
|
|
||||||
- construire des composants élémentaires
|
- construire des composants élémentaires ;
|
||||||
- combiner ces composants
|
- combiner ces composants ;
|
||||||
- utiliser une structure pyramidale : les composants sont les éléments de
|
- utiliser une structure pyramidale : les composants sont les éléments de
|
||||||
composants plus complexes.
|
composants plus complexes.
|
||||||
|
|
||||||
|
|
||||||
- découplage de l'ensemble en composants indépendants (gros programmes réalisables)
|
- découplage de l'ensemble en composants indépendants (gros programmes réalisables) ;
|
||||||
- donner de la structure (rendre les gros programmes compréhensibles)
|
- donner de la structure (rendre les gros programmes compréhensibles) ;
|
||||||
- spécifier les liens entre les composants (rendre les programmes maintenables)
|
- spécifier les liens entre les composants (rendre les programmes maintenables) ;
|
||||||
- identifier les sous-composants indépendants (rendre les programmes réutilisables)
|
- identifier les sous-composants indépendants (rendre les programmes réutilisables) ;
|
||||||
- forcer l'abstraction (augmenter la sureté du programme)
|
- forcer l'abstraction (augmenter la sureté du programme).
|
||||||
|
|
||||||
Les méthodes spéciales
|
Les méthodes spéciales
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
méthodes spéciales correspondants aux interfaces des types de bases :
|
Méthodes spéciales correspondant aux interfaces des types de bases :
|
||||||
|
|
||||||
.. function:: __init__(self, *args, **kwargs)
|
.. function:: __init__(self, *args, **kwargs)
|
||||||
le constructeur de l'instance d'objet
|
le constructeur de l'instance d'objet
|
||||||
|
@ -106,9 +106,9 @@ aux attributs est règlable.
|
||||||
>>> cobj.__dict__['insattr']
|
>>> cobj.__dict__['insattr']
|
||||||
'an instance attribute'
|
'an instance attribute'
|
||||||
|
|
||||||
les attributs ne sont pas systématiquement encapsulées en python.
|
Les attributs ne sont pas systématiquement encapsulés en python.
|
||||||
|
|
||||||
pour contrôler l'accès aux attributs, on utilise les méthodes spéciales::
|
Pour contrôler l'accès aux attributs, on utilise les méthodes spéciales::
|
||||||
|
|
||||||
__getattr__(self, name)
|
__getattr__(self, name)
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ pour contrôler l'accès aux attributs, on utilise les méthodes spéciales::
|
||||||
Dict with a default value
|
Dict with a default value
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
il est possible d'hériter des types de base
|
Il est possible d'hériter des types de base
|
||||||
|
|
||||||
>>> a = dict.defaultdict(default=0)
|
>>> a = dict.defaultdict(default=0)
|
||||||
>>> a
|
>>> a
|
||||||
|
|
|
@ -134,7 +134,7 @@ Password:
|
||||||
.. module:: shelve
|
.. module:: shelve
|
||||||
:synopsis: linéarisation de données
|
:synopsis: linéarisation de données
|
||||||
|
|
||||||
linéarisation de données
|
Linéarisation de données
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
>>> import shelve
|
>>> import shelve
|
||||||
|
|
|
@ -60,7 +60,7 @@ deux
|
||||||
1
|
1
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
fonctions
|
Fonctions
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
>>> def blabla(x):
|
>>> def blabla(x):
|
||||||
|
@ -69,7 +69,7 @@ fonctions
|
||||||
...
|
...
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
il n'y a que des fonctions (et pas de procédures):
|
Il n'y a que des fonctions (et pas de procédures):
|
||||||
|
|
||||||
|
|
||||||
>>> def ma_func(x):
|
>>> def ma_func(x):
|
||||||
|
@ -147,13 +147,13 @@ argumments nommés {'tata': 3, 'tutu': 2}
|
||||||
>>> vars(a)
|
>>> vars(a)
|
||||||
{'a': 'titi', 'b': 'toto'}
|
{'a': 'titi', 'b': 'toto'}
|
||||||
|
|
||||||
puisque tout est objet en python, ``vars(mon_objet)`` est équivalent à
|
Puisque tout est objet en python, ``vars(mon_objet)`` est équivalent à
|
||||||
``mon_objet.__dict__``
|
``mon_objet.__dict__``
|
||||||
|
|
||||||
|
|
||||||
- générateurs et compréhension de liste
|
- générateurs et compréhension de liste
|
||||||
|
|
||||||
les compréhensions de listes permettent de générer de nouvelles listes
|
Les compréhensions de listes permettent de générer de nouvelles listes
|
||||||
|
|
||||||
exemple :
|
exemple :
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ exemple :
|
||||||
[(2, 4), (2, 5), (2, 6), (2, 7), (3, 4), (3, 5), (3, 6), (3, 7), (4, 4), (4, 5), (4, 6), (4, 7)]
|
[(2, 4), (2, 5), (2, 6), (2, 7), (3, 4), (3, 5), (3, 6), (3, 7), (4, 4), (4, 5), (4, 6), (4, 7)]
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
les expressions générateurs
|
Les expressions générateurs
|
||||||
|
|
||||||
>>> expr = (2*i for i in range(10))
|
>>> expr = (2*i for i in range(10))
|
||||||
>>> expr
|
>>> expr
|
||||||
|
@ -190,10 +190,10 @@ les expressions générateurs
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
|
|
||||||
le polymorphisme paramétrique
|
Le polymorphisme paramétrique
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
polymorphisme exemple de contexte :
|
Polymorphisme exemple de contexte :
|
||||||
la fonction print
|
la fonction print
|
||||||
|
|
||||||
>>> print 1
|
>>> print 1
|
||||||
|
@ -203,7 +203,7 @@ la fonction print
|
||||||
|
|
||||||
.. todo:: `print 1` et `print "1"` renvoient le même résultat. Pourquoi ?
|
.. todo:: `print 1` et `print "1"` renvoient le même résultat. Pourquoi ?
|
||||||
|
|
||||||
la programmation par exceptions
|
La programmation par exceptions
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
>>> def function_raise(x):
|
>>> def function_raise(x):
|
||||||
|
@ -224,7 +224,7 @@ Pas le bon type
|
||||||
ou bien lever une exception
|
ou bien lever une exception
|
||||||
|
|
||||||
|
|
||||||
programmation objet
|
Programmation objet
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
- la programmation objet définit des classes
|
- la programmation objet définit des classes
|
||||||
|
@ -249,13 +249,13 @@ hello
|
||||||
|
|
||||||
- définition d'une classe :
|
- définition d'une classe :
|
||||||
|
|
||||||
méthode classique :
|
Méthode classique :
|
||||||
|
|
||||||
>>> class A:
|
>>> class A:
|
||||||
... pass
|
... pass
|
||||||
...
|
...
|
||||||
|
|
||||||
méthode dynamique (la fonction :func:`type` est ici un **constructeur** :
|
Méthode dynamique (la fonction :func:`type` est ici un **constructeur** :
|
||||||
|
|
||||||
>>> type("A", (), {})
|
>>> type("A", (), {})
|
||||||
<class '__main__.A'>
|
<class '__main__.A'>
|
||||||
|
@ -264,16 +264,16 @@ méthode dynamique (la fonction :func:`type` est ici un **constructeur** :
|
||||||
>>> type(a)
|
>>> type(a)
|
||||||
<class '__main__.A'>
|
<class '__main__.A'>
|
||||||
|
|
||||||
types et classe
|
Types et classe
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
affichage d'une calculette, il faut créer un type `Touche`
|
Affichage d'une calculette, il faut créer un type `Touche`
|
||||||
qui contient deux désignations : `Chiffre` et `operation`::
|
qui contient deux désignations : `Chiffre` et `operation`::
|
||||||
|
|
||||||
type operation = Plus | Moins | Divise
|
type operation = Plus | Moins | Divise
|
||||||
type touche = Chiffre of int | Memoire | Op of operation
|
type touche = Chiffre of int | Memoire | Op of operation
|
||||||
|
|
||||||
soit, on définit un type touche, soit on ne définit pas ce type::
|
Soit on définit un type touche, soit on ne définit pas ce type::
|
||||||
|
|
||||||
type operation = Plus | Moins | Divise
|
type operation = Plus | Moins | Divise
|
||||||
type memoire = Memoire
|
type memoire = Memoire
|
||||||
|
|
|
@ -3,14 +3,14 @@ Tests unitaires et pile d'appels
|
||||||
|
|
||||||
Les tests automatiques sont un complément à la déclaration des types.
|
Les tests automatiques sont un complément à la déclaration des types.
|
||||||
|
|
||||||
que tester, quoi tester ?
|
Que tester, quoi tester ?
|
||||||
|
|
||||||
- que les composants interagissent bien entre eux
|
- que les composants interagissent bien entre eux
|
||||||
- que les unités (fonctions, objets...) réagissent bien à une entrée spécifique
|
- que les unités (fonctions, objets...) réagissent bien à une entrée spécifique
|
||||||
- que le code se comporte de la manière attendue dans des environnements différents
|
- que le code se comporte de la manière attendue dans des environnements différents
|
||||||
(systèmes d'exploitation, etc...)
|
(systèmes d'exploitation, etc...)
|
||||||
|
|
||||||
les types de tests :
|
Les types de tests :
|
||||||
|
|
||||||
- tests unitaires
|
- tests unitaires
|
||||||
- tests fonctionnels
|
- tests fonctionnels
|
||||||
|
@ -52,7 +52,7 @@ http://pytest.org/latest/
|
||||||
|
|
||||||
- écrire un fichier commençant par `test_` qui teste les fonctions du fichier
|
- écrire un fichier commençant par `test_` qui teste les fonctions du fichier
|
||||||
|
|
||||||
options utiles dans `py.test`
|
Options utiles dans `py.test`
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
::
|
::
|
||||||
|
@ -67,10 +67,10 @@ options utiles dans `py.test`
|
||||||
py.test -k test_simple
|
py.test -k test_simple
|
||||||
|
|
||||||
|
|
||||||
utiliser la pile d'appel pour débugger
|
Utiliser la pile d'appel pour débugger
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
utiliser la pile d'appels, elle se lit de bas en haut. Il est possible de
|
Utiliser la pile d'appels, elle se lit de bas en haut. Il est possible de
|
||||||
provoquer cette pile d'appels.
|
provoquer cette pile d'appels.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
@ -79,7 +79,7 @@ provoquer cette pile d'appels.
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
|
|
||||||
traiter une exception avec
|
Traiter une exception avec
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
|
@ -95,9 +95,9 @@ traiter une exception avec
|
||||||
bla bla
|
bla bla
|
||||||
|
|
||||||
|
|
||||||
créer le plus possible ses propres exceptions spécifiques au programme
|
Créer le plus possible ses propres exceptions spécifiques au programme.
|
||||||
|
|
||||||
utiliser le module :mod:`pdb`
|
Utiliser le module :mod:`pdb`
|
||||||
|
|
||||||
.. module:: pdb
|
.. module:: pdb
|
||||||
:synopsis: debugger de la lib standard
|
:synopsis: debugger de la lib standard
|
||||||
|
@ -144,7 +144,7 @@ Remarquons que :mod:`pdb` utilise le module :mod:`cmd`, voir :ref:`cmdlabel` qu'
|
||||||
(Pdb)
|
(Pdb)
|
||||||
|
|
||||||
|
|
||||||
last but not least :
|
Last but not least :
|
||||||
|
|
||||||
utiliser pylint ou pychecker
|
utiliser pylint ou pychecker
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue