4
votes

Comment lire les signatures de fonction de la documentation officielle de Python

Si l'on parcourt les documents officiels Python , on peut voir les signatures de fonction (ou de classe) de différents types.

Pour un exemple

random.uniform (a, b)

est simple à comprendre: vous lui passez deux objets a et b (qui sont des nombres à virgule flottante et il renvoie un nombre aléatoire à partir de l'intervalle entre eux). La signature de

est tout aussi simple à comprendre

SSLSocket.getpeercert (binary_form = False)

où une valeur par défaut pour l'argument est également spécifiée, au cas où il serait appelé sans aucun argument.


Mais il y a aussi des fonctions avec des signatures vraiment bizarres comme

min (itérable, * [ clé, par défaut])

ou

readline.append_history_file (nelements [ filename])

ou

csv.register_dialect (nom [ dialecte [ ** fmtparams]])

Qu'est-ce que tout cela signifie? Existe-t-il un guide de référence expliquant comment lire des éléments tels que name [ dialect [ ** fmtparams]] ?

Ces exemples ont été tirés au hasard de la documentation officielle Python et ne couvrent pas tous les types de signatures que j'ai rencontrés. J'ai besoin d'une explication générale sur la manière de lire ces signatures.


0 commentaires

4 Réponses :


2
votes

NB: Je sais que cela a déjà été demandé mais je ne trouve pas le dup, donc si quelqu'un le fait, veuillez m'envoyer un bip et je supprimerai ma réponse ...

Il s'agit principalement d'une notation EBNF simplifiée . register_dialect (name [ dialect [ ** fmtparams]]) signifie que les fonctions register_dialect prennent un argument name obligatoire, un dialecte argument et arguments de mot-clé arbitraires facultatifs.


2 commentaires

Est-ce que register_dialect (name [ ** fmtparams [ dialect]]) aurait également été une signature acceptalbe, ou l'ordre est-il important d'une certaine manière?


L'ordre est en effet "important d'une certaine manière" (même si un peu moins en Python3). dialect est un paramètre positionnel (vous n'avez pas besoin de le nommer, juste pour le passer comme le nième - ici deuxième - argument).



1
votes

Une notation courante est que les crochets [] représentent des valeurs facultatives . Je ne sais pas d'où cela vient, c'est peut-être la grammaire BNF.

* représente n'importe quel nombre d'arugments de position . ** représente n'importe quel nombre d'arugments de mots clés .

* et ** sont une syntaxe Python légitime. vous pouvez avoir une signature de fonction ressemblant à func (* args) par exemple. Celles-ci sont définies dans la référence du langage . Une lecture plus facile pourrait être le tutoriel python . < / p>


0 commentaires

1
votes

Les paramètres entre crochets sont facultatifs. Cela signifie qu'ils ont une valeur par défaut qui est utilisée si vous ne fournissez pas de valeur. Si vous lisez la description de la fonction, est généralement expliqué.

Lorsque vous avez des crochets imbriqués, cela signifie que l'argument dans le crochet intérieur ne peut pas être fourni si au moins un des arguments dans le crochet extérieur n'est pas fourni. Par exemple:

csv.register_dialect (nom [ dialecte [ ** fmtparams]])

signifie que: csv.register_dialect (nom) est valide, csv.register_dialect (nom, dialecte) est valide, csv.register_dialect (nom, dialecte) , ** fmtparams) est valide mais csv.register_dialect (nom, ** fmtparams) n'est pas valide.

* et ** sont des arguments et des kwargs, ici plus de références à leur sujet.


1 commentaires

plus1. Grande mention de l'utilisation de crochets imbriqués!



2
votes

L'astérisque dans l'exemple ci-dessous signifie que clé et valeur par défaut sont des arguments de mots clés uniquement:

min (itérable, * [ clé, par défaut])

Les paramètres entre crochets sont facultatifs, donc ci-dessous filename est facultatif:

readline.append_history_file (nelements [ filename])

Un argument avec un seul astérisque signifie que la fonction peut avoir n'importe quel nombre d'arguments positionnels , par exemple:

une_fonction (a, b, * args)

Un argument avec 2 astérisques signifie que la fonction peut avoir n'importe quel nombre d'arguments de mot clé , par exemple:

class dict (mapping, ** kwarg)

Tout est expliqué dans la documentation Python: Définitions des fonctions


1 commentaires

Il semble qu'il y ait toujours des arguments obligatoires, puis des arguments optionnels, et à l'intérieur de chacun de ces deux cas, nous énumérons d'abord les arguments "normaux", puis les arguments de position et ensuite les arguments de mot-clé. Est-ce exact?