Que signifie la barre oblique dans la sortie help ()?

148

Que /signifie la helpsortie de Python 3.4 rangeavant la parenthèse fermante?

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...
Joschua
la source

Réponses:

185

Cela signifie la fin des paramètres positionnels uniquement , paramètres que vous ne pouvez pas utiliser comme paramètres de mot-clé. Avant Python 3.8, ces paramètres ne pouvaient être spécifiés que dans l'API C.

Cela signifie que l' keyargument à __contains__ne peut être passé que par position ( range(5).__contains__(3)), pas en tant que mot-clé argument ( range(5).__contains__(key=3)), ce que vous pouvez faire avec des arguments positionnels dans des fonctions python pur.

Consultez également la documentation Argument Clinic :

Pour marquer tous les paramètres comme positionnels uniquement dans Argument Clinic, ajoutez un /sur une ligne par lui-même après le dernier paramètre, en retrait de la même manière que les lignes de paramètres.

et le (très récent ajout à) la FAQ Python :

Une barre oblique dans la liste des arguments d'une fonction indique que les paramètres qui la précèdent sont uniquement positionnels. Les paramètres de position uniquement sont ceux sans nom utilisable en externe. Lors de l'appel d'une fonction qui accepte les paramètres de position uniquement, les arguments sont mappés à des paramètres basés uniquement sur leur position.

La syntaxe fait désormais partie de la spécification du langage Python, à partir de la version 3.8 , voir PEP 570 - Paramètres de position Python uniquement . Avant PEP 570, la syntaxe était déjà réservée pour une éventuelle inclusion future dans Python, voir PEP 457 - Syntaxe pour les paramètres positionnels uniquement .

Les paramètres de position uniquement peuvent conduire à des API plus propres et plus claires, rendre les implémentations en Python pur de modules autrement C-uniquement plus cohérents et plus faciles à maintenir, et comme les paramètres de position uniquement nécessitent très peu de traitement, ils conduisent à un code Python plus rapide.

Martijn Pieters
la source
23

J'ai posé cette question moi-même. :) Découvrez ce qui a /été initialement proposé par Guido ici .

Proposition alternative: que diriez-vous d'utiliser '/'? C'est un peu l'opposé de «*» qui signifie «argument mot-clé», et «/» n'est pas un nouveau caractère.

Puis sa proposition l' emporta .

Il h. Si c'est vrai, ma proposition «/» l'emporte:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

Je pense que le document très pertinent qui couvre ce sujet est le PEP 570 . Où la section récapitulative est belle.

résumer

Le cas d'utilisation déterminera les paramètres à utiliser dans la définition de la fonction:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

À titre indicatif:

Utilisez uniquement la position si les noms n'ont pas d'importance ou n'ont aucune signification, et qu'il n'y a que quelques arguments qui seront toujours passés dans le même ordre. Utilisez des mots clés uniquement lorsque les noms ont une signification et que la définition de la fonction est plus compréhensible en étant explicite avec les noms.


Si la fonction se termine par /

def foo(p1, p2, /)

Cela signifie que tous les arguments fonctionnels sont positionnels.

prosti
la source
6
Choisir le /jeton, parce que "c'est l'opération inverse de *" montre que Python est juste un peu fou. C'est une sorte de synesthésie.
Tomasz Gandor
7

La barre oblique (/) indique que tous les arguments antérieurs sont uniquement des arguments positionnels. La fonctionnalité d'arguments positionnels uniquement a été ajoutée dans python 3.8 après l' acceptation de PEP 570 . Initialement, cette notation a été définie dans PEP 457 - Notation pour la notation pour les paramètres de position uniquement

Les paramètres de la définition de fonction avant la barre oblique Foraward (/) sont uniquement positionnels et les paramètres suivis d'une barre oblique (/) peuvent être de n'importe quel type selon la syntaxe. Où les arguments sont mappés à des paramètres positionnels uniquement en fonction de leur position lors de l'appel d'une fonction. La transmission de paramètres de position uniquement par mots-clés (nom) n'est pas valide.

Prenons l'exemple suivant

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

Ici, dans la définition de fonction ci-dessus, les paramètres a et b sont uniquement positionnels, tandis que x ou y peuvent être positionnels ou mots clés.

Les appels de fonction suivants sont valides

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

Mais, l'appel de fonction suivant n'est pas valide, ce qui déclenche une exception TypeError car a, b ne sont pas passés en tant qu'arguments de position à la place en tant que mot-clé

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo () a reçu des arguments positionnels uniquement passés comme arguments de mot-clé: 'a, b'

De nombreuses fonctions intégrées en python n'acceptent que des arguments positionnels où passer des arguments par mot-clé n'a pas de sens. Par exemple, la fonction intégrée len n'accepte qu'un seul argument positionnel (uniquement), Où appeler len comme len (obj = "hello world") nuit à la lisibilité, vérifiez help (len).

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Les paramètres uniquement positionnels facilitent la maintenance des fonctions c / library sous-jacentes. Il permet aux noms de paramètres des paramètres uniquement positionnels d'être modifiés à l'avenir sans risque de rupture du code client qui utilise l'API

Enfin et surtout, les paramètres positionnels uniquement nous permettent d'utiliser leurs noms pour être utilisés dans des arguments de mots-clés de longueur variable. Vérifiez l'exemple suivant

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

Les paramètres uniquement positionnels sont mieux expliqués ici à Types d'arguments de fonction en python: Paramètres positionnels uniquement

La syntaxe des paramètres de position uniquement a été officiellement ajoutée à python3.8. Commander les nouveautés python3.8 - arguments que position

Lié à PEP: PEP 570 - Paramètres de position uniquement Python

néotam
la source