¿Qué significa la barra diagonal cuando help() enumera las firmas de los métodos?
¿Qué significa en la salida /
de Python 3.4 antes del paréntesis de cierre?help
range
>>> 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.
...
Significa el final de los parámetros solo posicionales , parámetros que no se pueden utilizar como parámetros de palabras clave. Antes de Python 3.8, dichos parámetros solo se podían especificar en la API de C.
Significa que el key
argumento a __contains__
solo se puede pasar por posición ( range(5).__contains__(3)
), no como argumento de palabra clave ( range(5).__contains__(key=3)
), algo que se puede hacer con argumentos posicionales en funciones puramente de Python.
Consulte también la documentación de Argument Clinic :
Para marcar todos los parámetros como solo posicionales en Argument Clinic, agregue un
/
en una línea sola después del último parámetro, con la misma sangría que las líneas de los parámetros.
y la (muy reciente incorporación) a las preguntas frecuentes de Python :
Una barra diagonal en la lista de argumentos de una función indica que los parámetros anteriores son solo posicionales. Los parámetros solo posicionales son aquellos que no tienen un nombre utilizable externamente. Al llamar a una función que acepta parámetros solo posicionales, los argumentos se asignan a parámetros basándose únicamente en su posición.
La sintaxis ahora es parte de la especificación del lenguaje Python, a partir de la versión 3.8 , consulte PEP 570 – Parámetros solo posicionales de Python . Antes de PEP 570, la sintaxis ya estaba reservada para una posible inclusión futura en Python; consulte PEP 457 - Sintaxis para parámetros solo posicionales .
Los parámetros solo posicionales pueden conducir a API más limpias y claras, hacer que las implementaciones puramente Python de módulos que de otro modo serían solo C sean más consistentes y fáciles de mantener, y debido a que los parámetros solo posicionales requieren muy poco procesamiento, conducen a un código Python más rápido.
Yo mismo hice esta pregunta. :) Descubrí que /
Guido lo propuso originalmente aquí .
Propuesta alternativa: ¿qué tal usar '/'? Es algo opuesto a '*', que significa "argumento de palabra clave", y '/' no es un carácter nuevo.
Entonces ganó su propuesta .
Je. Si eso es cierto, mi propuesta '/' gana:
def foo(pos_only, /, pos_or_kw, *, kw_only): ...
Creo que el documento muy relevante que cubre esto es el PEP 570 . Donde la sección de resumen se ve bien.
Resumen
El caso de uso determinará qué parámetros usar en la definición de la función:
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
Como orientación:
Utilice solo posicional si los nombres no importan o no tienen significado, y solo hay unos pocos argumentos que siempre se pasarán en el mismo orden. Utilice solo palabras clave cuando los nombres tengan significado y la definición de la función sea más comprensible al ser explícita con los nombres.
Si la función termina con/
def foo(p1, p2, /)
Esto significa que todos los argumentos funcionales son posicionales.