IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Typage statique (fort?) pour Python3.10 et +


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    ...
    Inscrit en
    septembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Arts - Culture

    Informations forums :
    Inscription : septembre 2015
    Messages : 25
    Points : 3
    Points
    3
    Par défaut Typage statique (fort?) pour Python3.10 et +
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def concat(a: str, b: str) -> str:
        return a + b
    Cette fonction renvoie la chaîne de caractères "48" sur :
    Et 12 sur :
    Existe-t-il un moyen d'obliger python3 à générer un warning à l'écriture et/ou (à défaut et au moins) une erreur à l'exécution ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 778
    Points : 35 870
    Points
    35 870
    Par défaut
    Salut,

    Citation Envoyé par Mr ZEE Voir le message
    Existe-t-il un moyen d'obliger python3 à générer un warning à l'écriture et/ou (à défaut et au moins) une erreur à l'exécution ?
    Des outils comme mypy vont vérifier que le typage statique est respecté en analysant le code avant exécution.
    Tout ça est bien expliqué dans la documentation du module typing (qui comprend de nombreux renvois).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 130
    Points : 29 588
    Points
    29 588
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Mr ZEE Voir le message
    Existe-t-il un moyen d'obliger python3 à générer un warning à l'écriture et/ou (à défaut et au moins) une erreur à l'exécution ?
    assert
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def concat(a: str, b: str) -> str:
    	assert isinstance(a, str)
    	assert isinstance(b, str)
    	return a + b
    L'avantage c'est qu'en mode dev c'est pris en compte mais quand le truc est vérifié/finalisé, il te suffit d'exécuter en mode optimisé et les assert sont alors ignorés
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 778
    Points : 35 870
    Points
    35 870
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    L'avantage c'est qu'en mode dev c'est pris en compte mais quand le truc est vérifié/finalisé, il te suffit d'exécuter en mode optimisé et les assert sont alors ignorés
    C'est ce qu'on faisait "avant"... Et je ne suis pas sûr que mélanger une vérification dynamique soit "en ligne" avec le typage statique utilisé.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 130
    Points : 29 588
    Points
    29 588
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    C'est ce qu'on faisait "avant"
    Et "avant" c'est synonyme de "has been"? Les outils comme mypy c'est bien pour checker un code "simple", style j'appelle concat(1, 2) avec des valeurs à la con. Mais que se passe-t-il si les valeurs proviennent d'un flux externe style bdd?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 778
    Points : 35 870
    Points
    35 870
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mais que se passe-t-il si les valeurs proviennent d'un flux externe style bdd?
    Les échanges se font via des tuples de... qu'on peut décorer avec un typage statique (comment fait-on avec C++, Java?)

    Citation Envoyé par Sve@r Voir le message
    Et "avant" c'est synonyme de "has been"?
    Non je dirais qu'on écrira:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def concat(a, b):
    	assert isinstance(a, str)
    	assert isinstance(b, str)
    	return a + b
    ou (exclusif)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def concat(a: str, b: str) -> str:
    	return a + b
    ie. on utilise le typing avec les outils qui sont autour... et on évite de faire une mixture.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 130
    Points : 29 588
    Points
    29 588
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    on évite de faire une mixture.
    Compris
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 424
    Points : 6 249
    Points
    6 249
    Par défaut
    Hello,

    Citation Envoyé par Sve@r Voir le message
    Bonjour

    assert
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def concat(a: str, b: str) -> str:
        assert isinstance(a, str)
        assert isinstance(b, str)
        return a + b
    L'avantage c'est qu'en mode dev c'est pris en compte mais quand le truc est vérifié/finalisé, il te suffit d'exécuter en mode optimisé et les assert sont alors ignorés
    Alors, tout à fait en accord avec @wiztricks, mais j'ai un peu de temps pour développer un avis sur la question.

    assert est utilisé pour les tests (unitaires et intégrations) principalement.

    Il est conseillé généralement sur son code d'interrompre le programme à l'aide d'un raise quand un type d'objet fourni en paramètre de la fonction ne correspond pas au besoin.
    Une fois la fonction créée, en prenant en compte les différentes erreurs possibles, on crée des tests unitaires qui permettent de vérifier tout ça.

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def concat(a: str, b: str) -> str:
        if not isinstance(a, str) and not isinstance(b, str):
            raise TypeError("a and b must be strings")
     
        return a + b
    et les tests unitaires (avec pytest)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import pytest
    from module import concat
     
    def test_concat_with_bad_parameter_a():
        with pytest.raises(TypeError):
            concat(1, 'a')
     
    def test_concat_with_bad_parameter_b():
        with pytest.raises(TypeError):
            concat('a', 1)
     
    def test_concat_with_bad_parameters():
        with pytest.raises(TypeError):
            concat(1, 2)
     
    def test_concat():
        assert concat('a', 'b') == 'ab'
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    février 2008
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 7 473
    Points : 19 179
    Points
    19 179
    Par défaut
    cela ne devrait-il pas être not or not ? car l'un des deux paramètres pourrait bien être un str, non ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 130
    Points : 29 588
    Points
    29 588
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il est conseillé généralement sur son code d'interrompre le programme à l'aide d'un raise quand un type d'objet fourni en paramètre de la fonction ne correspond pas au besoin.
    Oui mais un test/raise sera fait tout le temps, y compris en prod quand le truc est finalisé. Et, comme le disait Nedry dans Jurassic Park avant qu'il se fasse violer par sais plus quel bestiau (celui qui a une colerette et qui crache du venin), ça bouffe des cycles inutilement...
    Alors qu'un assert, une fois le code finalisé, est alors shunté en mode prod...

    Citation Envoyé par N_BaH Voir le message
    cela ne devrait-il pas être not or not ? car l'un des deux paramètres pourrait
    bien être un str, non ?
    Hé oui. Encore une fois la loi de De Morgan not(A et B)=not(A) ou not(B) a été foulée aux pieds de la méconnaissance
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 424
    Points : 6 249
    Points
    6 249
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    cela ne devrait-il pas être not or not ? car l'un des deux paramètres pourrait bien être un str, non ?
    Ce qui est le cas dans mes tests non ? Et pourtant mes tests passent... car naturellement la concaténation d'un entier et d'une chaîne de caractères provoque déjà un TypeError.
    Dans ce cas il aurait fallu vérifier dans mes tests le message d'erreur retourné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def test_concat_with_bad_parameter_a():
        with pytest.raises(TypeError) as err:
            concat(1, 'a')
     
        assert str(err.value) == "a and b must be strings"
    J'ai été vite en effet dans l'écriture de mon code exemple effectivement, mais c'est plus pour montrer le principe, je modifie donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def concat(a: str, b: str) -> str:
        if not isinstance(a, str) or not isinstance(b, str):
            raise TypeError("a and b must be strings")
     
     
        return a + b
    EDIT:

    Oui mais un test/raise sera fait tout le temps, y compris en prod quand le truc est finalisé. Et, comme le disait Nedry dans Jurassic Park avant qu'il se fasse violer par sais plus quel bestiau (celui qui a une colerette et qui crache du venin), ça bouffe des cycles inutilement...
    Alors qu'un assert, une fois le code finalisé, est alors shunté en mode prod...
    Privilégier la performance à la sécurité est un risque qu'on peut prendre mais que je ne prendrai jamais... L'environnement de développement peut être fonctionnel, ce n'est pas pour autant qu'en production ça sera le cas, en tout cas on ne peut l'assurer à 100% avec l'utilisation de assert, car son travail s'arrête à l'environnement de dev. Par contre, raise fonctionnera quelque soit l'environnement...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 778
    Points : 35 870
    Points
    35 870
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Privilégier la performance à la sécurité est un risque qu'on peut prendre mais que je ne prendrai jamais...
    Dans le cas particulier, le a + b natif plante déjà en TypeError si a et b ne sont pas du même type avec un message d'erreur explicite: un test fait via assert ou sans plantera avec un autre message d'erreur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 424
    Points : 6 249
    Points
    6 249
    Par défaut
    Hello,

    Citation Envoyé par wiztricks Voir le message
    Dans le cas particulier, le a + b natif plante déjà en TypeError si a et b ne sont pas du même type avec un message d'erreur explicite: un test fait via assert ou sans plantera avec un autre message d'erreur.

    - W
    Oui c'est ce que j'indique dans mon précédent post

    Ce qui est le cas dans mes tests non ? Et pourtant mes tests passent... car naturellement la concaténation d'un entier et d'une chaîne de caractères provoque déjà un TypeError.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Typage des méthodes pour application externe
    Par maniolo dans le forum Services Web
    Réponses: 3
    Dernier message: 03/07/2009, 10h53
  2. Réponses: 1
    Dernier message: 31/03/2009, 10h50
  3. Solution VPN avec authentification forte pour PME
    Par JuJu° dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 05/12/2007, 10h29
  4. [vs 2005] nom fort pour dll
    Par Husqvarna dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 27/02/2007, 19h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo