Un peu de tendresse avec le Lèche-Page    —  PM

Discussions

Python : apprentissage, ide, etc

Tchou 3291 Bob
Reprise automatique du message précédent.
Vu qu'il y a (?) un sous-système bash et terminal désormais sous W10, y'a pas moyen d'avoir les "bonnes" commandes voire un ecosystème python particulier sans avoir à tout réinstaller ?
Guybrush 7784 Bob
Je vote pour la solution de tout virer et de repartir sur une base propre :-)

Je te suggère, une fois que tout est viré, de :
- Installer Python 3 (3.5, 3.6 ou 3.7, peu importe) ;
- Installer VSCode et l'extension Python (il va la proposer automatiquement, si ce n'est pas déjà installé par défaut, dès que tu ouvriras un fichier Python) ;
- Installer "pew" (voir premier message du thread) pour la gestion des environnements virtuels.

Ensuite, tu crées un nouvel environnement pour "ton projet en cours" avec "pew new -a PATH NAME" où "PATH" est l'endroit où se situe ton projet (c'est facultatif, mais ainsi quand tu "switches" dans l'environnement, il te fait un "cd" automatiquement) et "NAME" est le nom de l'environnement (souvent le nom du projet, par facilité).

Dans un terminal, "pew workon NAME" permet de lancer un sous-terminal dans cet environnement virtuel. Tout ce que tu fais dans cet environnement en lien avec Python affectera uniquement cet environnement (donc si tu tapes "pip install X", ça n'installe X que dans cet environnement).

Dans VSCode, tu peux choisir quel interpréteur utiliser pour chaque workspace. Pour qu'il détecte automatiquement tous les interpréteurs disponibles (c'est-à-dire ceux des environnements virtuels), tu peux définir "python.venvPath" dans le user settings. Chez moi, il vaut "~/.local/share/virtualenvs" (parce que "pew" centralise tous les environnements à cet endroit, donc le listing est simple ;-)). Ensuite, dans le workspace setting, définis "python.pythonPath" (ou utilise la commande palette pour choisir l'interpréteur associé à ton projet, et VSCode définira lui-même cette entrée).
yaug 1338 Spammeur
Bon,
Tout a été désinstallé.
Python réinstallé.
Pew installé avec succès.
VSCode réinstallé même si ce n'est pas du tout la version que j'avais avant et que du coup je suis déjà perdu.

Après les pip install XXXX pour ramener les libs dont j'ai besoin, j'ai pu lancer le code d'un des scripts fait par les stagiaires. Déjà un gros progrès par rapport à hier.
yaug 1338 Spammeur
Bon mes 3 scripts à tester fonctionnent.
Je me lis python.swaroopch.com du coup pour me mettre à jour.

Question, au niveau convention de naming, c'est quoi le plus répondu pour le naming de variables, de classes et de fonctions.
Du camelcase ? Snakecase ?
Guybrush 7784 Bob
Du PythonCase :-D

C'est un mix entre lowercase_underscore et CamelCase :
- Les fonctions et variables en lowercase_underscore ;
- Les classes en CamelCase.

Vu qu'une méthode en Python est en fait une fonction liée (liée à l'objet), on utilise aussi lowercase_underscore pour les noms de méthodes. Ce qui fait qu'en gros, c'est du lowercase_underscore partout sauf pour les classes.

Plus d'infos dans la PEP8 (qui couvre aussi d'autres aspects des conventions) :
www.python.org/dev/peps/…
yaug 1338 Spammeur
Question gestion de configuration.
Je vais avoir à gérer des confis pour stocker des données répétitives (plusieurs adresses de dossier différent mais que je vais réutiliser souvent, quelques IP, des accès à une bdd etc).
J'aurais tendance à me faire un fichier yml pour stocker tout ça, des conseils de bonnes pratiques ?

Car là voir que les stagiaires ont fait ça en dur plusieurs fois cela me hérisse le poil (et je l'ai dru !)
Guybrush 7784 Bob
Si ton outil est un CLI, c'est encore mieux comme ça on peut lui passer le path vers la config "on the fly". Sinon, ça me choque pas spécialement d'avoir une constante en début de code avec la config courante, genre (en un ou plusieurs fichiers) directement en Python :
OPTIONS = {
'choix1': {
'param1': 'valeur1',
'param2': 'valeur2',
},
'choix2': {
'param1': 'autrevaleur1',
'param2': 'autrevaleur2',
},
}

[...]

CONFIG = OPTIONS['choix2']
En bricolant ça, ça va assez vite. Et tu peux passer à "mieux" facilement, puisque la plupart des loaders yaml/json chargent des dictionnaires (comme c'est le cas ci-dessus).

Sinon y a quelques formats "propres" à Python dans la stdlib, mais je n'ai jamais vraiment utilisé :
docs.python.org/3/librar…

L'approche de Django pour gérer les configs est d'avoir un fichier ".py" pour chaque "variante", et ensuite de charger le "bon" en fonction de ce que l'utilisateur veut (il faut utiliser importlib pour gérer dynamiquement l'import dans ce cas). L'avantage, c'est que le fichier de config reste du Python (donc on peut utiliser toutes les joyeusetés qu'on veut dedans) et qu'on peut même importer des valeurs depuis un autre fichier de config. L'inconvénient, c'est que c'est du code Python interprété (et tous les "soucis" qui vont avec si c'est défini par les users).
yaug 1338 Spammeur
Merci pour le retour.
Je partais sur une fichier, car je vais avoir plusieurs programmes qui vont utiliser les mêmes infos, cela m'évitait de de devoir changer les constantes pour chacun. Mais du coup je peux utiliser un fichier python comme tu l'indiques, et l'appeler dans chacun des programmes.

Autre sujet, je suis en train de checker un peu la génération de pdfs voir ce qu'il est possible de faire. Tu as des retours là dessus ? Tu fais du full LATEX ou tu as utilisé des libs ?
Guybrush 7784 Bob
Pour la partie "configuration avec fichier Python" :

Si tu comptes l'utiliser dans plusieurs projets qui ne sont pas dans les mêmes répertoires (ou apparentés), le module (le fichier de conf) ne sera pas importable. Quelques pointeurs pour le coup : soit modifier sys.path depuis Python pour y ajouter le répertoire du fichier (le module os et pathlib possèdent pas mal de petits helpers pour facilement récupérer le chemin relatif/absolu d'un fichier cible, quelque soit l'OS). L'autre solution est de regarder du coté d'importlib qui peut être utilisé pour importer un fichier "à la volée" sur base de son chemin. C'est pas évident/explicite si on cherche dans la doc, mais y a une question SO pile poil adaptée : stackoverflow.com/questi… (j'suis tombé dessus il y a quelques semaines pour aider un étudiant ^^).


Pour la partie génération pdf

Je n'ai jamais généré de PDF via Python. Personnellement, je passe toujours par Latex (et quand je dois le faire via Python, je passe quand même via Latex). Par contre, je t'invite à regarder du coté de Jinja2 (jinja.pocoo.org/), c'est un système de templates en Python (probablement l'un des meilleurs, d'ailleurs). Ca te permettrait de "pré-remplir" ton fichier Latex, et ensuite tu utilises Python pour injecter ton contenu dedans, et puis tu fais appel à Latex pour le convertir en PDF (module subprocess en Python, y a quelques helpers comme check_call ou check_output de mémoire pour exécuter une commande externe facilement).
yaug 1338 Spammeur
Pour la génération de pdf, je suis tombé sur ce lien où jinja est utilisé justement.
La solution proposé me plait pas mal.

Répondre

Vous devez être inscrit et identifié.