PyconFr, tu viens pour les talks et tu te retrouves à apprendre plein de trucs en discutant avec les uns et les autres. Et puis entre les anciens étudiants, les core devs Python ou Mercurial, il y avait du beau monde et plein de trucs à apprendre. Hop aperçu non exhaustif des deux sujets qui m'ont marqués (ce qui n'enlève évidement aucun intérêt aux autres sujets).
Mais avant ça merci à Quarkslab pour m'avoir permi d'aller à cette conf, et un spécial merci à @VictorStinner pour sa patience.
Les Aventuriers du Packaging Perdu
Honnêtement, je partais sceptique sur cette conf, pensant avoir suffisament roulé ma bosse sur le sujet. Mais j'ai découvert pleins de trucs !
- La possibilité de migrer une partie des infos présentent dans le
setup.py
vers lesetup.cfg
, on en apprend bien sur plus en lisant la doc sur le setup.cfg. - Petite piqûre de rappel sur le schéma de version utilisé dans Python PEP440. On notera le suffix
post0
pour les petits patchs en douce post release et le suffixdev
pour… les versions de dev. - Découverte du paquet twine qui corrige certains soucis de sécurité (entre autre) liés à
python setup.py sdist upload
. - Découverte de la version test de pypi, qui permet de tester l'upload d'un projet sans que ce soit visible par la version officielle (
twine upload -r test
) - Découverte de l'initiative manylinux qui vise à faciliter la construction de wheel portable. Ça passe par des images docker basées sur CentOS, ce qui semble une bonne idée.
L'humour de la présentation était goûtu « Did you ever metadata you didn't like? », « parce que c'est notre projet »… J'ai ri.
Tester les performances, pourquoi et comment ?
Argumentaire très intéressant comme quoi les performances sont une fonctionnalité comme une autre du code, qu'elles font partie de l'expérience utilisateur. Et qu'elles méritent leurs tests.
Parmi tous les problèmes rencontrés, on compte la reproductibilité, le besoin d'un historique pour détecter les changements… Une remarque qui m'a bien plue : penser à séparer la partition sur laquelle s'exécute les benchmarks du reste, pour éviter les effets de bords. L'outil utilisé pour gérer la collecte des benchmarks s'appelle asv et pour attaquer en mode force brute le problème de la reproductibilité, une machine dédiée a fait l'affaire !
Et c'est dans tout, c'que je n'dis pas, que tu te reconnaitras
Les discussions de traverses et certains exposés m'ont donné des idées / éveiller à de nouveaux concepts, alors je les refourgue, tel un margoulin (cc @wisk) ici.
- CPython utilise un script interne basé sur des annotations dans des commentaires autour de certains builtins C pour harmoniser la documentation, et optimiser l'unboxing des arguments. Vive le code généré !
- Dans CPython, plusieurs fichiers générés (genre le
./configure
ou ceux générés par la fonctionnalité ci-dessus) sont stockés dans le dépôt git, avec un hook de commit qui s'assure qu'ils soient à jour. - Une sorte d'annuaire à l'ancienne de softs Python une taxonomy python
- Les annotations de type, qui faisaient l'objet de mon exposé, sont utiles à des projets comme moyen de documentation, et pour permettre de vérifier que l'interface des plugins est bien respectée.
- L'idée d'avoir des tests de non-regression de performance en normalisant par rapport à une référence calculée dynamiquement. Dans le cadre de pythran, on pourrait par exemple vérifier que le code généré va
k
fois plus vite que le code numpy, mais ça reste dépendant de la version du compilo etc, donc la fenêtre de test risque d'être assez lâche. - Quand on habite dans le sud de la france, on peut avoir des scorpions en liberté dans son jardin o_O
- la réponse officielle au problème de typosquatting dans PyPi, super bien documentée !
Concernant les annotations de type, j'ai bien aimé la question qui demandait comment documenter le type de retour de la fonction suivante :
def foo(n: int):
class SomeTypeDependingOnN(object):
some_attr: int = n
return SomeTypeDependingOnN
Qui est une sorte de meta-classe du pauvre. Et bien ça parait compliqué vu que le type est local à la fonction :-)
Et hop, cadeau, le petit code utilisé pour introduire mon exposé :
_: print((list(map(_.append, map(chr, [104,101,108,108,111]))),\n", "".join(_))[1]) = []
# Tout n'est pas rose malgré la ville
Posté par ze0 . Évalué à 10.
Mention spéciale à l'irrespect involontaire de beaucoup d'auditeur.
Involontaire, mais bien réel. Ces gens qui sortent d'un talk super en A001 sur un sujet qui les passionnent, qui changent de salle pour aller assister à une autre en A002, et qui rentrent dans la salle sans attendre que la conf précédente soit fini. Se disant oui mais je ne fais pas de bruit.
Seulement bruit de portes + bruits de pas (oui 15-20 personnes qui rentre dans une salle même en faisant gaffe ça fait du bruit) + bruit de grincement des sièges qu'il faut "déplier" + l'absence de micro = Grosse gène.
Ce n'est pas facile pour des conférenciers de parler super fort, surtout quand ces derniers ne sont pas maître de l'exercice. Alors, tous ces gens qui font du bruit, rendent difficile d'entendre la conclusion ou les questions.
Ça coute quoi d'attendre la fin de la conf pour rentrer ?
Ces personnes sont si égoïstes qu'elles se disent si le sujet les intéressent pas c'est pareil pour ceux qui sont déjà dans la salle ?
Encore en B00 il y avait un micro, c'est dérangeant de voir des gens rentrer, ça perturbe, mais au moins on entend.
J'envisage très sérieusement de venir avec des affiches l'année prochaine, style
Merci d'attendre la fin pour rentrer, respectez les conférenciers et auditeurs.
Excusez mon ton un peu acerbe, mais ça m'a gâché la fin de plusieurs confs, j'ai trouvé cela insupportable.
Je me suis dit qu'en parler ici aidera à un peu à ne pas reproduire cette situation.
# Je rougis
Posté par Twidi (site web personnel) . Évalué à 4. Dernière modification le 26 septembre 2017 à 20:34.
Merci serge_ans_paille pour ta critique du talk "Les Aventuriers du Packaging Perdu" dont j'étais un des présentateurs.
Content que tu, parmi d'autres, aies appris quelque chose. Note que c'est également le cas pour nous qui avons découvert certaines choses lors de la préparation.
Quant à ta conclusion sur notre humour… content également de n'avoir pas trop fait de flops :)
Bref, merci. Je rougis.
# Les perfs c'est la vie
Posté par lothiraldan . Évalué à 4.
Merci serge_sans_paille pour ton billet!
On as mis en ligne les slides de notre présentation sur les tests de performances, elles sont ici: https://octobus.net/presentations/perf_test.html#/
On espère avoir été intéressant, ce n'est malheureusement pas un sujet présenté très fréquemment malheureusement.
Longue vie à Python et aux Tests!
# version généraliste du générateur de code de cpython
Posté par Xavier Combelle (site web personnel) . Évalué à 4.
En fait, l'outil ayant inspiré le générateur de code de cpython et dont le générateur de cpython n'est qu'une version spécifique à la tache est: https://nedbatchelder.com/code/cog/ C'est du bon mangez en!
Exemple tiré de la documentation (basique pour comprendre comment ca marche:
Vous écrivez ce code source
Vous le faites passé à la moulinette cog et ca donne ca:
Et vous pouvez à nouveau modifier le code source python et repasser a la moulinette pour regénérer au sein du même fichier le code source.
L'idée de base est que le code généré est le le code générant sont gardés dans le même source
# Slides du talk sur le packaging
Posté par Twidi (site web personnel) . Évalué à 2.
Les slides de notre talk sur le packaging sont maintenant en ligne
https://twidi.github.io/python-packaging-talk/fr
[^] # Re: Slides du talk sur le packaging
Posté par jihele . Évalué à 2.
Chez moi ça fait une page noire.
En fouillant dedans j'ai trouvé ça :
[^] # Re: Slides du talk sur le packaging
Posté par jihele . Évalué à 2.
Merci pour les diapos. J'étais pas à la PyCon.
Récemment, à la lecture de ces pages :
https://blog.ionelmc.ro/2014/05/25/python-packaging/
https://hynek.me/articles/testing-packaging/
j'ai tenté de modifier une lib pour mettre les sources dans un répertoire src/ à part.
L'avantage (cf. les pages pré-cités) c'est que ça permet que tox teste l'installation plutôt que les fichiers locaux, donc vérifie au passage que le setup.py merde pas. Ce qui est pas mal. J'ai déjà eu un cas où les tests passaient mais la lib marchait pas parce que certains fichiers étaient présents localement mais manquants dans le package.
Cf aussi la doc de pytest : https://docs.pytest.org/en/latest/goodpractices.html#tests-outside-application-code
J'ai essayé de faire ça, donc, et ça soulevait d'autres questions.
Aujourd'hui, quand je teste avec pytest + coverage sur 3 version de python, la couverture qui est remontée est l'union des trois tests. C'est bien parce qu'en général c'est la même chose pour les trois versions, juste quelques wrappers de compatibilité qui changent. Mais dans l'absolu, ça "prouve" pas qu'on a une bonne couverture sur une version en particulier. Sur cet exemple, c'est pas dramatique, mais plutôt que des versions de Python, ça peut être des libs ou des versions de lib.
Quand on déplace le code source dans /src, tox différencie les environnements et renvoie une couverture pour chaque version (environnement tox) de chaque fichier. Les blogs cités plus haut indiquent une méthode pour fusionner les couvertures et avoir l'union des couvertures, mais ça commence à faire lourd en bidouilles pour pas grand-chose.
Pour finir, j'ai conservé la structure actuelle qui est celle des bibliothèques que je connais et celle que vous présentez.
Avez-vous un commentaire sur la limitation de cette structure via-à-vis de pytest / tox ?
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.