9
votes

Python Positional args et mots-clés arguments

Je lis les codes source de mercurial et j'ai trouvé une telle Func def dans Commands.py :

def import_(ui, repo, patch1=None, *patches, **opts):
    ...


2 commentaires

Avez-vous déjà résolu cela? Si vous avez, ce serait bien si vous sélectionnez la réponse qui vous a fait résoudre le problème comme "accepté" et upvote tous les utiles (si vous ne l'avez pas fait déjà!). :)


Désolé, j'ai été très occupé tous ces jours-ci. Je vais maintenant lire vos réponses et sélectionnez une. Merci pour vous tous:)


4 Réponses :


2
votes

Parce que le passage de la clé d'un argument de mots clés peut être facultatif si la position de celle-ci est sans ambiguïté. Observez:

>>> def f(ui, p1=None, p2=None, *patches, **opts):
...    print p1, p2
... 
>>> f(1, 'a', 'b', 3)  #p2 is a positional argument with default value?
a b
>>> f(1, p2='b')  #p2 is a keyword argument?
None b


1 commentaires

Oui ... à mon avis, c'est une ambiguïté du temps d'exécution, pas une ambiguïté de définition du temps. Comme l'OP est concerné par la définition de la fonction Je décrivais la définition de la fonction . Mais je reconnais, c'est un bon point à noter.



3
votes

Vous dérouissez probablement la définition de la fonction et la syntaxe d'appel de fonction un bit.

Patch1 code> n'est pas un mot-clé arg, c'est un positionnement argument avec une valeur d'argumentation par défaut. P>

* Les correctifs code> sont une liste d'arguments et non un argument de position. P>


Veuillez consulter cette section sur les didacticiels officiels: P>

  • http://docs.python.org/Tutorial/ Controlflow.html # Plus de fonctions de définition li> ul>

    Permettez-moi de résumer les points principaux en utilisant cette fonction comme exemple: P>

    # demonstrate how some additional positional and keyword arguments are passed
    f1(1, 2, 3, 4, 5, 6, 7, a4=8, a5=9, a6=10)
    # prints:
    # 1 2 3 (4, 5, 6, 7) {'a5': 9, 'a4': 8, 'a6': 10}
    

  • 2 commentaires

    Je trouve cette définition légèrement ambiguë (bien que pas incorrecte). Voir les modifications dans ma réponse pourquoi.


    Voir mon exemple, vous pouvez utiliser Patch1 comme argument de mots clés à condition qu'il n'y ait aucun argument de position après cela.



    9
    votes

    Jetez un coup d'œil sur le PEP 3102 aussi il semble que son en quelque sorte liée à Ce .

    résumer, patchs et opts Existe-t-il d'accepter des arguments variables, mais le plus tard est d'accepter des arguments de mots clés. Les arguments de mots-clés sont transmis comme un dictionnaire où, comme le Les arguments de position variable seraient enveloppé comme des tuples . p>

    de votre exemple p> xxx pré>

    n'importe quel paramètre de position après u1, repo et patch1 code> être enveloppé comme des tuples dans des patchs. Tous les arguments de mots clés suivant les arguments de position variable seraient enveloppés comme des objets de dictionnaires via OPTS. p>

    Une autre chose importante est que, l'onus réside avec l'appelant pour s'assurer que la condition non-key argolaire ARC après l'argulaire code> n'est pas violé. P>

    quelque chose qui enfreint cela augmenterait une erreur de syntaxe .. p>

    par exemple p>

    appels comme p> xxx pré>

    sont valides, mais P>

    u1 = 1, repo = 2, patch1 = 3 , patches=(), and opts={"test":"test"}
    you can use patch1 as a keywords argument but doing so you cannot wrap any variable positional arguments within patches
    


    1 commentaires

    Merci pour vos exemples et vos références, je pense avoir ma réponse. Les arguments de Python sont tellement flexibles, je ne le savais pas assez bien avant cette question.



    2
    votes

    Je crois quand appelant une fonction avec: xxx

    Ceci utiliserait un argument "mot-clé", mais quand défini a Interface de la fonction avec: xxx

    Vous définissez une "valeur par défaut". ()

    afin de répondre à votre question; Avoir une valeur par défaut après qu'un argument de position est parfaitement normal, vous appelez donc une fonction avec un argument de mots clés avant un mot clé.

    Notez également, lorsque vous appelez une fonction, vous ne peut pas avoir un argument de mots clés après un mot clé.


    0 commentaires