Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur arguments de fonction

    27 décembre 2014 à 23:26:15

    Bonjour,

    Je suis le cours sur python quand j'essaie l'exemple sur mon mac, j'ai une erreur.

    Est ce qu'il faut une version Python spécifique ?

    kikis-mac-pro:~ kiki$ python
    Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
    [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    
    >>> def rint(*values, sep=' ', end='\n', file=sys.stdout):
      File "<stdin>", line 1
        def rint(*values, sep=' ', end='\n', file=sys.stdout):
                            ^
    SyntaxError: invalid syntax

    Merci de vos réponses

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 décembre 2014 à 0:54:10

      Ta fonction rint ressemble à la fonction print de Python 3. Tu essais de la recoder toi-même ?

      En tout cas, oui la version de ton Python est la raison de cette erreur de syntaxe. En Python 2 les arguments sous la forme *args doivent toujours être après les arguments normaux et les keywords : def func(arg, *args, **kwargs). Tu ne pourras donc pas implémenter la fonction print de Python 3 en Python 2.

      • Partager sur Facebook
      • Partager sur Twitter
        28 décembre 2014 à 15:10:15

        En effet. Toutefois il pourra tout de même avoir les fonctionnalités de la fonction print() de Python 3 en Python 2 s'il fait

        from future import print_function
        print('Cou', end='cou')
        
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 décembre 2014 à 16:20:00

          Je l'avais oublié ce module __future__ pourtant si utile !

          Mais s'il s'agit de ré-implémenter la fonction, on peut aussi le faire comme ça :

          import sys
          
          def print_(*args, **kwargs):
              "print_(*values, sep=' ', end='\n', file=sys.stdout)"
              kwargs.get('file', sys.stdout).write(
                  kwargs.get('sep', ' ').join(map(str, args)) + kwargs.get('end', '\n')
              )
          
          • Partager sur Facebook
          • Partager sur Twitter
            28 décembre 2014 à 20:28:01

            Merci pour vos réponses. En fait pour le moment je ne programme rien.

            J'essaie juste de comprendre le cours.

            Donc si je veux faire (ca semble être natif de Python 3) : 

            >>> def fonction(*values, arg1=' ', arg2='max', file=sys.stdout):

            Comment faire cela en Python < 3 ?

            @ncnc : merci pour ton code, mais je ne comprends pas, si tu peux donner plus d'explication, ca m'intéresse.



            • Partager sur Facebook
            • Partager sur Twitter
              28 décembre 2014 à 22:08:53

              Pas aussi facilement. Il faudra faire

              def fonction(*values, **kwargs):
              
              arg1 = kwargs.get('arg1', ' ')
              arg2 = kwargs.get('arg2', 'max')
              file = kwargs.get('file', sys.stdout)
              
              print arg1, arg2, file, values
              
              </pre>
              • Partager sur Facebook
              • Partager sur Twitter
                29 décembre 2014 à 8:06:16

                Donc, arg1, arg2, file sont des arguments qui viennent de **kwargs.

                Sauf que si je comprends l'appel de la "fonction", ces arguments sont par défaut, donc on fait juste :

                >>> fonction()

                Mais comment le programme sait que arg1='  ', arg2='max', file=sys.stdout ?

                • Partager sur Facebook
                • Partager sur Twitter
                  29 décembre 2014 à 9:45:55

                  Si tu regardes bien, au moment du kwargs.get, une seconde valeur est passée en paramètre, la valeur par défaut à utiliser si le paramètre n'est pas présent (' ', 'max', sys.stdout).

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 décembre 2014 à 15:23:51

                    @entwanne : Merci je comprens mieux.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 décembre 2014 à 16:04:00

                      Effectivement ca marche mieux en Python 3

                      Python 3.4.2 (default, Dec 29 2014, 15:45:41)
                      [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
                      
                      >>> def foo(*values, sep=' ', end='\n', file='sys.stdout'):
                      ...     for val in enumerate(values):
                      ...             val = str(val)
                      ...             print('Valeur : %s' % val)
                      ...     print('sep : %s --, end : %s --, file : %s' % (sep,end,file))
                      ...
                      >>> foo()
                      sep :   --, end :
                       --, file : sys.stdout
                      >>> foo(1,2)
                      Valeur : (0, 1)
                      Valeur : (1, 2)
                      sep :   --, end :
                       --, file : sys.stdout
                      



                      • Partager sur Facebook
                      • Partager sur Twitter

                      Erreur arguments de fonction

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown