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 :

Intérêt des paramètres optionnels dans les fonctions ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Mars 2023
    Messages : 6
    Par défaut Intérêt des paramètres optionnels dans les fonctions ?
    Bonjour,

    Je me forme actuellement sur Python.
    En testant une fonction constructeur, j'étais persuadé que celle-ci allait planter dans le sens où l'ensemble des paramètres n'était pas saisi (cf exemple ci-dessous pour c et d).
    Dans un second temps, j'ai lu que les paramètres étaient optionnels.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def __init__(self, a, b):
            self.a1 = a
            self.b2 = b
            self.c3 = c
            self.d4 = d
    Du coup, je ne comprends pas quel est leur intérêt ? Pourquoi en mettre certains et pas les autres ?
    Merci.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    étonnant qu'il accepte des chiffres comme nom de variables, c'est contre toutes les règles de nommage connues (à ma connaissance du moins). (jamais de chiffre en 1er caractère du nom de variable)

    et ici self.1, self.2, self.3, self.4 ne sont pas des paramètres optionnels, mais des variables d'instances

    Et comme l'a fait remarqué fred199, ça plante après renommage des variables.
    Saisies dans le shell IDLE:
    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
    18
    19
    20
    21
     
    >>> class Dumm:
    ...     def __init__(self,a,b):
    ...         self.1=a
    ...         
    SyntaxError: invalid syntax
    >>> class Dumm:
    ...     def __init__(self,a,b):
    ...         self.a1=a
    ...         self.b1=b
    ...         self.c1=c
    ...         self.d1=d
    ... 
    ...         
    >>> d=Dumm(1,2)
    Traceback (most recent call last):
      File "<pyshell#12>", line 1, in <module>
        d=Dumm(1,2)
      File "<pyshell#10>", line 5, in __init__
        self.c1=c
    NameError: name 'c' is not defined

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 : 21 743
    Par défaut
    Citation Envoyé par Millennial Voir le message
    En testant une fonction constructeur, j'étais persuadé que celle-ci allait planter dans le sens où l'ensemble des paramètres n'était pas saisi (cf exemple ci-dessous pour c et d).
    Python est un langage interprété => ca va planter lorsque la fonction sera exécutée s'il ne trouve pas c et d dans l'espace global à la fonction/méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> def f(a, b):
    ...     x = a
    ...     y = b
    ...     z = c
    ...
    >>> f(1, 2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in f
    NameError: name 'c' is not defined
    L'aspect important ici est "tester par vous même, se familiariser avec les messages d'erreur".
    Citation Envoyé par Millennial Voir le message
    - Donc en ligne 6, il n'est pas choquant éventuellement de faire un init sans aucun paramètre. Soit def __init__(self): ?
    Ce qui est choquant, c'est d'écrire ici alors que vous auriez pu tester avant...

    Citation Envoyé par Millennial Voir le message
    Vous dites qu'il n'y a pas d'intérêt à poser des questions conception mais quand on débute, il est quand même important de comprendre ce que l'on fait, de comprendre les concepts avant de passer à la syntaxe non ?
    C'est quoi la différence entre une variable (locale ou globale) et un attribut? Normalement, vous devez avoir passé du temps dans un tuto pour savoir y répondre par vous même...

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

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Mars 2023
    Messages : 6
    Par défaut
    Citation Envoyé par wiztricks Voir le message

    Ce qui est choquant, c'est d'écrire ici alors que vous auriez pu tester avant...
    Mais non justement, même en cas d'absence de message d'erreur, il se peut que la convention ne tolère pas une telle pratique.
    Mon interrogation portait sur les bonnes pratiques dans la vraie vie. Est-il usuel de déclarer l'ensemble des paramètres dans une fonction constructeur ? Fred m'a répondu que cela dépendait des "besoins métiers"... donc il ne s'agit pas d'une question de test au préalable. Ce que j'ai fait d'ailleurs : c'est l'absence d'erreur qui m'a fait poster ici.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Lorsqu’un posteur originel (PO) modifie le contenu de son post initial sur un forum après qu’une ou plusieurs réponses ont été apportées, cela peut entraîner les problématiques suivantes :
    1. Incohérence entre la question et les réponses
    2. Perte de clarté pour les lecteurs
    3. Complexité de la modération


    Une bonne pratique est d'informer les lecteurs ou les contributeurs des modifications (vous n'avez pas à le faire car j'ai supprimé ma réponse, quoique pour @umfred ça semble être encore d'actualité).

    EDIT:

    Vous dites qu'il n'y a pas d'intérêt à poser des questions conception mais quand on débute, il est quand même important de comprendre ce que l'on fait, de comprendre les concepts avant de passer à la syntaxe non ?
    Sauf que votre post originel, indiquait en majorité des problèmes de syntaxe, voilà ce qui se passe quand on ne pose pas le problème de la bonne manière.

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    - Donc en ligne 6, il n'est pas choquant éventuellement de faire un init sans aucun paramètre. Soit def __init__(self): ?
    Selon vous construire une voiture sans préciser sa couleur, son type, ... vous paraît intéressant ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Mars 2023
    Messages : 6
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Selon vous construire une voiture sans préciser sa couleur, son type, ... vous paraît intéressant ?

    Non. Justement, mon interrogation portait sur le fait que je puisse accèder à un attribut (self.date_adhesion et self.status*) sans l'avoir déclaré comme paramètre dans ma fonction init.

    Merci, je taggue en resolu ce post

    * Comme j'aurais pu saisir self.marque ou self.modele

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Millennial Voir le message
    Non. Justement, mon interrogation portait sur le fait que je puisse accèder à un attribut (self.date_adhesion et self.status*) sans l'avoir déclaré comme paramètre dans ma fonction init.
    Il n'y a pas de rapport. Un paramètre, que ce soit pour une fonction ou une classe (et dans ce dernier cas il sera renvoyé vers la fonction __init__ donc ça reste une fonction) c'est un élément passé à la fonction par son appelant.
    Mais rien n'interdit à la fonction de créer ses propres variables internes, variables qui n'ont alors aucun rapport avec les paramètres (même si généralement la fonction devant traiter ses paramètres utilisera pour cela ses variables internes)
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def fonction(xxx):
        toto=123
        titi=456
        return toto + titi * xxx

    Et donc si on élargi cette réllexion aux classes, ses méthodes peuvent elles-aussi définir leurs propres variables ou même des attributs sans que les paramètres reçus aient un rôle à jouer dans cette action.
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class vehicule:
        def __init__(self, marque, modele):
            self.marque=marque
            self.modele=modele
            self.km=0
        def roule(self, km): self.km+=km
     
    v=vehicule("bmw", "Serie 8")
    v.roule(140)
    print(v.km)

    Citation Envoyé par Millennial Voir le message
    Est-il usuel de déclarer l'ensemble des paramètres dans une fonction constructeur ?
    Uniquement les paramètres dont l'objet a besoin pour exister. En revanche il est usuel de créer tous les attributs dans le __init__. Dans mon exemple précédent j'aurais pu créer self.km dans la méthode roule() mais ça aurait été plutôt mal vu.
    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]

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 : 21 743
    Par défaut
    Citation Envoyé par Millennial Voir le message
    Non. Justement, mon interrogation portait sur le fait que je puisse accèder à un attribut (self.date_adhesion et self.status*) sans l'avoir déclaré comme paramètre dans ma fonction init.
    init n'est pas une fonction mais une méthode qui s'écrit __init__.

    Mais à vous de vous poser des questions du genre: "est ce que toutes les variables (locales) utilisées dans une fonction doivent être passés en paramètre?". Vous devriez facilement trouver des contre-exemples!

    La différence entre une variable locale et un attribut d'instance est dans la durée de vie: la variable locale n'existe que lorsque la fonction est "active" et sera détruite à la sortie. L'attribut d'un objet "persiste" à la sortie d'une méthode (mais rien n'interdit à une méthode d'avoir/créer des variables locale (ce que sont les paramètres reçus comme "self").
    Et pour l'instant, vu le sac de nœuds que vous faites entre paramètres/fonction/méthodes/.portée des variables/attributs/... il faudrait prendre le temps de consolider ces notions et de vous fabriquer des repères. Sinon, vous allez être très vite perdu.

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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Mars 2023
    Messages : 6
    Par défaut
    Merci Svear et Wiztricks pour vos réponses explicites !

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Mars 2023
    Messages : 6
    Par défaut
    Bonjour Fred,

    Dans mon post initial, j'ai voulu résumer à la va-vite le code que j'avais executé.
    Le voici complet et il s'execute sans erreur :

    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    import datetime as dt
     
    """Creation de la Classe"""
    class Vehicules:
        def __init__(self, p_nb_roues, p_couleur):
            self.roues = p_nb_roues
            self.couleur = p_couleur
            self.date_adhesion = dt.date.today()
            self.actif = True
     
            pass
     
        """ la classe se termine à la première ligne non indentée """
     
    moto_1 = Vehicules(2, "rouge")
    vehicule_1 = Vehicules(4, "bleue")
     
    print(moto_1)
    print(moto_1.roues)
    print(moto_1.couleur)
    print(type(moto_1))
     
    moto_1.actif = False
    print(moto_1.actif)
    - Vous dites qu'il n'y a pas d'intérêt à poser des questions conception mais quand on débute, il est quand même important de comprendre ce que l'on fait, de comprendre les concepts avant de passer à la syntaxe non ?
    - Donc en ligne 6, il n'est pas choquant éventuellement de faire un init sans aucun paramètre. Soit def __init__(self): ?

    Merci

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    En "résumant" il faut quand même que ça suive une logique cohérente avec le vrai code et les règles de bases, sinon on va corriger des choses qui n'auraient pas lieu d'être "inutilement".

    Les variables self.XX qui ne sont pas initialisé par les paramètres du constructeur, sont utiles à la classe et on ne souhaite pas qu'elles puissent être définie par l'utilisateur dans le constructeur (selon le besoin de la classe). Ici on a la date du jour (à la création de l'instance), il est inutile de demander à l'utilisateur de lui fournir, et on indique par principe que si on créé l'instance, celle-ci est active (donc self.actif= True)

    Et non il n'est pas choquant d'avoir un __init__ sans paramètre, si il n'y a pas besoin d'initialiser de valeur propre à l'instance ou la classe par le constructeur.

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par Millennial Voir le message
    il n'est pas choquant éventuellement de faire un init sans aucun paramètre. Soit def __init__(self): ?
    Non, puisque cela dépend entièrement de ta classe. Avoir plus d'attributs d'instance que de paramètres dans la fonction d'initialisation est classique (ce que tu as bien fait)

    lu que les paramètres étaient optionnels
    Ceci est une toute autre histoire ! pour toute fonction (et donc méthode), il est possible d'avoir des paramètres optionnels. Dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __init__(self, nb_roues, couleur):
    ...
    car = Vehicules()  # PLANTAGE
    Ici, on utilise des paramètres optionnels (avec valeur par défaut):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __init__(self, nb_roues=4, couleur="blanc"):
    ...
    car = Vehicules()  # OK
    ---------

    EDIT

    Intérêt des paramètres optionnels dans les fonctions ?
    pas logique ton titre ! la plupart des fonctions que tu utilises dans python ont des paramètres optionnels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/08/2020, 13h55
  2. Usage des pointeurs dans les fonctions
    Par didou31 dans le forum Débuter
    Réponses: 12
    Dernier message: 22/11/2011, 13h31
  3. Réponses: 1
    Dernier message: 14/06/2010, 16h24
  4. Réponses: 15
    Dernier message: 23/01/2010, 18h39
  5. Réponses: 6
    Dernier message: 27/08/2008, 13h58

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