Que fait le /
_ signifie dans Python _ help
de 3.4 sortie pour range
avant 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.
...
Cela signifie la fin des paramètres de position uniquement , les paramètres que vous ne peuvent pas utilise comme paramètre de mot clé. De tels paramètres ne peuvent être spécifiés que dans l'API C.
Cela signifie que l'argument key
de __contains__
Ne peut être passé que par position (range(5).__contains__(3)
), et non comme argument de mot clé (range(5).__contains__(key=3)
), quelque chose vous pouvez faire avec des arguments de position dans des fonctions pure-python.
Voir aussi la documentation Argument Clinic :
Pour marquer tous les paramètres comme étant uniquement positionnels dans Argument Clinic, ajoutez un
/
Sur une ligne distincte après le dernier paramètre, identique aux lignes de paramètre.
et le (ajout récent à) le 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 des paramètres positionnels uniquement, les arguments sont mappés sur des paramètres basés uniquement sur leur position.
La syntaxe a également été définie pour une éventuelle inclusion future dans Python, voir PEP 457 - Syntaxe pour les paramètres de position uniquement .
Ce PEP a récemment été relancé et a été accepté pour inclusion dans Python . Avec Python 3.8 toujours en phase alpha, cela peut devenir une réalité dans cette version ou dans la version 3.9, en fonction de la rapidité avec laquelle l'implémentation de référence peut être finalisée.
Les paramètres de position uniquement peuvent conduire à des API plus propres et plus claires, rendre les implémentations en Python plus pures de modules autrement en C uniquement plus cohérents et plus faciles à maintenir, et comme les paramètres en position uniquement nécessitent très peu de traitement, ils permettent d'accélérer Python. code.
J'ai posé cette question moi-même. :) Découvert que /
a été proposé à l'origine par Guido dans ici .
Proposition alternative: comment utiliser '/'? C'est un peu l'opposé de "*" qui signifie "argument de mot clé", et "/" n'est pas un nouveau caractère.
Puis sa proposition gagné .
Il h. Si cela est vrai, ma proposition '/' gagne:
def foo(pos_only, /, pos_or_kw, *, kw_only): ...
Je pense que le document très pertinent couvrant ceci est PEP 57 . Où la section récapitulative a l'air bien.
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 positionnel uniquement si les noms importent peu ou n'ont pas de signification, et seuls quelques arguments seront toujours transmis dans le même ordre. Utilisez uniquement des mots clés lorsque les noms ont une signification et que la définition de la fonction est plus compréhensible en expliquant les noms.
Si la fonction se termine par /
def foo(p1, p2, /)
Cela signifie que tous les arguments fonctionnels sont positionnels.