1.Tutorials
Python Tutorial
- Commande python
- Si "Py Launcher" installé:
py
- Arguments peuvent être lus avec module sys:
sys.argv[indice]
- Fichiers sources encodés en UTF-8
- any non-zero integer value is true
VS Code Getting Started
- TODO pour chaque projet car sinon c'est galere, VS Code ne retrouve pas le venv:
- Ne pas utiliser "uv" car pas 100% compatible avec VSCode, de plus il requiert l'installation de Rust + VS Build tools qui prennent 7GB...
- Le terminal VSCode par défaut doit être Command car si c'est Powershell ça ne marche pas terrible terrible...
- Créer le rep
- Dans le rep créer un venv:
py -m venv .venv
- Ouvrir le rep avec VS Code:
- Status barre en ouvrant un fichier py doit afficher la présence du venv
- Le terminal intégré
pip --version
doit afficher la version de pip avec son chemin vers le venv
- S'assurer que Terminal par défaut VSCode = Command & qu'il autoload le venv s'il en détecte un !
- Config:
- Install the Python extension (VS Code Marketplace)
- Install an interpreter (from Python.org)
- Check the console:
py -3 --version
- Choisir la bonne version de l'interpreteur Python:
Ctrl+Shift+P
- Python: Select Interpreter
- Fichiers de config dans
./.vscode
:
settings.json
python.pythonPath
mis à jour lors de la sélection de l'interpreteur
launch.json
- Créer un environement virtuel:
- Cmd:
py -m venv .venv
- Popup "utiliser pour le workspace": oui
- L'activer:
.venv\Scripts\Activate.bat
- Choisir l'interpreteur Python de cet env
- Travailler sur le source + install package
- Le désactiver si plus besoin
- Run:
- Bouton "Play" en haut à gauche du source
F5
pour debug
- Même fonctionnement que pour les autres languages
F5
: Start debug
Maj+F5
: Stop debug
F9
: Set breakpoint
F10
: run
F11
: Go into
Shift+F11
: go outside
Ctrl+F5
- Utiliser Logpoint plutôt que Print pour tracker la valeur des variables
F9
/ Breakpoint
- Edit > Logpoint
Decorator
- References:
- Decorators wrap a function, modifying its behavior
- Consiste à encapsuler la fonction de base en ajoutant un comportement mais sans changer son nom
- Revient à écrire
base_func = decorate(base_func)
, decorate
renvoi une fonction qui wrappe base_func
- Le decorator est une fonction ou une classe:
- Pas besoin de passer explicitement la fonction a décorer: le passage est implicite
- Besoin de specifier liste args variable dans le wrapper qui override la référence initiale autrement le passage d'argument n'est pas possible (
*args
, **kwargs
) et appeler la fonction cible avec ces arguments:
*args
:
- Liste variable d'arguments
- S'applique uniquement pour les arguments non-nommés
- Produit une variable de type Liste à utiliser dans la fonction
**kwargs
:
- Liste variable d'arguments
- S'applique uniquement pour les arguments nommés
Func(nom="test")
=> Le nom de l'arg (nom
) devient la clé et valeur de l'arg (test
) devient la valeur
- Le tout devient une entrée dans le dictionnaire
- Produit une variable de type Dictionnaire à utiliser dans la fonction
- KWARGS = Key Word Args ;)

- Le wrapper doit retourner le call de la fonction à décorer autrement l'override par décorateur ne renvoit rien
- Le wrapper doit être décoré avec
@functools.wraps
afin de lui recopier les valeurs d'info provenant de la fonction de base (__name__
, __doc__
etc)
- Decorator simple:
# Definition - doc.py
import functools
# Decorator via une fonction
def decorator_name(func):
@functools.wraps(func)
def wrapper(*args, **kwargs): # définit un nombre variable d'arguments, nommés ou non
return func(*args, **kwargs) # depackte les listes et dictionnaires d'arguments en suite de variable
# pour être transparent vis-à-vis de la fonction lors de son appel
return wrapper
- Decorator avec arguments:
import functools
# Decorator avec arguments - besoin d'avoir un niveau d'imbrication supplémentaire
# car l'argument référence à la fonction à décorer est passé implicitement
def decorator_args(arg1="def value", …):
def wrapper_top(func):
@functools.wrap(func)
def wrapper_bottom(*args, **kwargs):
return func(*args, **kwargs)
return wrapper_bottom
return wrapper_top
- Decorator via une classe:
# besoin de configurer le constructeur et la fonction __call__
# __call__ est appelée lorsqu'on invoque l'instance de l'objet en tant que fonction
# o = ClassDecorator() puis o() ==> appelle la fonction __call__ de l'objet
class ClassDecorator:
def __init__(self, func):
functools.update_wrapper(self, func) //décore la classe avec les infos de la fonction source
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
- Utilisation d'un Decorator:
from deco import decorator_name
@decorator_name
def func_name():
pass
@deforator_args(key=value)
def func_name_2():
pass
# @ClassDecorator est équivalent à:
# _ = ClassDecorator() => appel du constructeur de la classe
# _() => appel fonction __call__ de l'objet
@ClassDecorator
def func_name_3():
pass