Python et les beaux boulons : fenêtres fluides, standard de code...

- 8 mins

Je n’ai pas mis assez de code sur ce blog en 2018. Commençons cette nouvelle année avec non pas de vœux de résolutions mais avec de nouveaux éléments pour passer vers un autre état par les actes.

Dans ce billet nous allons donc voir quelques astuces en langage pythonWikipedia, version 3, notamment un affichage fluide de données graphiques et la vérification de la conformité du code.

L’idée pour résolution de problème dont j’ai eu besoin provient de la lecture Gnu/Linux Magazine HS 95, saison 2, notamment les pages 41 et 611.

Pour faire un crépuscule ayahuasca nous allons utiliser Pygamedoc puis nous utliserons la pécision fine de pylintdoc pour analyser notre code.

Installation et objectif

$ sudo pip3 install pygame

Dans un fichier à l’aide du module pygame nous allons afficher une interprétation graphique d’un coucher de soleil avec des transition fluide (et un peu hallucinogène) pour appréhender l’usage de pygame et l’utilité de pygame.display.flip().

Code

Créons un fichier nommée ayahuasca.py

import pygame

if __name__ == '__main__':

    # Initialize  the stuff

    pygame.init()
    pygame.display.set_caption('Color crisis')

    # sets the window size

    screen = pygame.display.set_mode((750, 400))
    screen.fill((255, 255, 255))
    surface = pygame.display.get_surface()
    color = [0, 0, 250]
    for red in range(255):
        for green in range(255):

            # Allow bagless display

            pygame.display.flip()

            # draw circle as psychadelic blue sunset
            # width cannot be greater than radius 600, 460

            pygame.draw.circle(surface, color, (20, 10), 500, 460)
            color[1] = red
            color[0] = green

            # Updated display without bag
            pygame.display.flip()

    for event in pygame.event.get(pygame.QUIT):
        exit(0)

Executons le code : python3 ayahusaca.py

C’est pygame.display.flip() qui permet d’obtenir l’affichage ainsi.

La principale différence entre pygame.display.flip et pygame.display.update réside dans display.flip() qui met à jour le contenu de tout l’affichage ; display.update() permet de mettre à jour une partie de l’écran, au lieu de toute la zone d’affichage.

Vérification du code

« Les propositions d’amélioration de Python (ou PEP : Python Enhancement Proposal) sont des documents textuels qui ont pour objet d’être la voie d’amélioration de Python et de précéder toutes ses modifications. Un PEP est une proposition d’orientation pour le développement (process PEP), une proposition technique (Standard Track PEP) ou une simple recommandation (Informational PEP) »Wikipedia

Installons pylint :

$ sudo pip3 install pylint

Vérifions la qualité de notre substance nouvellement créée. Traquons les fautes de syntaxe ou de frappe, le style de notre code, en suivant les recommandations de style du langage Python (PEP8). Pour réaliser cela pylint est plus précis et plus verbeux que pep8 ou flake8 ou encore pycodestyle.

Invoquer Pylint

Pylint est destiné à être appelé depuis la ligne de commande. L’utilisation est :

$ pylint[options] modules_ou_packages

Le format par défaut pour la sortie est le texte brut. Vous pouvez changer cela en passant à pylint l’option --output-format=<value>. Les valeurs possibles sont : json, parseable, colorized et msvs (visual studio)Doc.

donc pour nous

$ pylint ayahuasca.py
************* Module ayahuasca
ayahuasca.py:1:0: C0111: Missing module docstring (missing-docstring)
ayahuasca.py:7:4: E1101: Module 'pygame' has no 'init' member (no-member)
ayahuasca.py:12:4: C0103: Constant name "screen" doesn't conform to UPPER_CASE naming style (invalid-name)
ayahuasca.py:14:4: C0103: Constant name "surface" doesn't conform to UPPER_CASE naming style (invalid-name)
ayahuasca.py:15:4: C0103: Constant name "color" doesn't conform to UPPER_CASE naming style (invalid-name)
ayahuasca.py:33:34: E1101: Module 'pygame' has no 'QUIT' member (no-member)

------------------------------------------------------------------
Your code has been rated at 1.76/10

WoW très mauvaise note !

Pour Info: flask8 n’a relevé aucune erreur dans ayahusaca.py

Corrigeons

pylint nous indique qu’il y a au moins 8 modifications à apporter pour être en conformité PEP 8. Voyons ensuit ce qu’il présiceDoc.

Et le format par défaut présente la réponse ainsi :

{path}:{line}:{column}: {msg_id}: {msg} ({symbol})

Ainsi, pylint nous signale avec [...]:1:0: C0111: Missing module docstring (missing-docstring) que que la ligne 1 viole la convention C0111 concernant les " " doctrings.

Si je veux en savoir un peu plus à ce sujet, je peux rejouer à la ligne de commande et essayer ceci :

$ pylint --help-msg=missing-docstring
:missing-docstring (C0111): *Missing %s docstring*
  Used when a module, function, class or method has no docstring.Some special
  methods like __init__ doesn't necessary require a docstring. This message
  belongs to the basic checker.

Essayons :

"""
    Module ayahuasca
    Author : XavCC
    Inspire from : GNU/Linux Magazine Hors-serie n°95, p. 41 & p.61
"""

import pygame

if __name__ == '__main__':

    # Initialize  the stuff

    pygame.init()
    pygame.display.set_caption('Color crisis')

    # sets the window size

    screen = pygame.display.set_mode((750, 400))
    screen.fill((255, 255, 255))
    surface = pygame.display.get_surface()
    color = [0, 0, 250]
    for red in range(255):
        for green in range(255):

            # Allow bagless display

            pygame.display.flip()

            # draw circle as psychadelic blue sunset
            # width cannot be greater than radius 600, 460

            pygame.draw.circle(surface, color, (20, 10), 500, 460)
            color[1] = red
            color[0] = green

            # Updated display without bag
            pygame.display.flip()

    for event in pygame.event.get(pygame.QUIT):
        exit(0)

Puis

$ pylint ayahuasca.py                
************* Module ayahuasca
ayahuasca.py:13:4: E1101: Module 'pygame' has no 'init' member (no-member)
ayahuasca.py:18:4: C0103: Constant name "screen" doesn't conform to UPPER_CASE naming style (invalid-name)
ayahuasca.py:20:4: C0103: Constant name "surface" doesn't conform to UPPER_CASE naming style (invalid-name)
ayahuasca.py:21:4: C0103: Constant name "color" doesn't conform to UPPER_CASE naming style (invalid-name)
ayahuasca.py:39:34: E1101: Module 'pygame' has no 'QUIT' member (no-member)

------------------------------------------------------------------
Your code has been rated at 2.35/10 (previous run: 1.76/10, +0.59)

pylint nous indique la progression de la note de notre code vers une convention acceptable.

Ce qui nous donne un code identique et avec une commande telle que :

pylint --const-rgx='[a-z_][a-z0-9_]{2,30}$' ayahuasca.py

-------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 1.76/10, +8.24)

Et voilà !

Des suggestions ? Des corrections ? Des critiques ? Des questions ? Ouvrez une Issue ou écrivez via les différents moyens via les icones de la page d’accueil de ce blog.

Notes et références

Merci à toutes les personnes qui soutiennent les efforts par leurs dons


Xavier Coadic

Xavier Coadic

Human Collider

rss framagit twitter github mail linkedin stackoverflow