¿Qué significa la barra inclinada en la salida de ayuda ()?

148

Lo que hace la /media en Python 3.4 helpsalida para rangeantes del paréntesis de cierre?

>>> 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
fuente

Respuestas:

185

Significa el final de los parámetros posicionales solamente , parámetros que no puede usar como parámetros de palabras clave. Antes de Python 3.8, dichos parámetros solo podían especificarse en la API de C.

Significa que el keyargumento a __contains__solo se puede pasar por position ( range(5).__contains__(3)), no como un argumento de palabra clave ( range(5).__contains__(key=3)), algo que puede hacer con argumentos posicionales en funciones de python puro.

Consulte también la documentación de la Clínica de argumentos :

Para marcar todos los parámetros como solo posicionales en Argument Clinic, agregue un /en una línea solo después del último parámetro, sangrado igual que las líneas de parámetros.

y la (muy reciente adición a) las preguntas frecuentes de Python :

Una barra diagonal en la lista de argumentos de una función denota que los parámetros anteriores son solo posicionales. Los parámetros solo posicionales son los 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 basados ​​únicamente en su posición.

La sintaxis ahora forma parte de la especificación del lenguaje Python, a partir de la versión 3.8 , consulte PEP 570 - Parámetros solo de posición 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 de Python puro de los módulos C-only 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.

Martijn Pieters
fuente
23

Hice esta pregunta yo mismo. :) Descubrí que /fue originalmente propuesto por Guido aquí .

Propuesta alternativa: ¿qué tal usar '/'? Es más o menos lo contrario de '*', que significa "argumento de palabra clave", y '/' no es un carácter nuevo.

Entonces su propuesta ganó .

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 PEP 570 . Donde la sección de recapitulación 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:

Use posicional solo 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.

prosti
fuente
66
Elegir el /token, porque "es la operación inversa de *" muestra, que Python está un poco loco. Es una especie de sinestesia.
Tomasz Gandor
7

La barra diagonal (/) indica que todos los argumentos anteriores son argumentos solo posicionales. La característica de argumentos solo posicionales se agregó en python 3.8 después de que se aceptara PEP 570 . Inicialmente, esta notación se definió en PEP 457 - Notación para notación para parámetros solo posicionales

Los parámetros en la definición de la función anterior a la barra diagonal (/) son solo posicionales y los parámetros seguidos por la barra diagonal (/) pueden ser de cualquier tipo según la sintaxis. Donde los argumentos se asignan a parámetros posicionales únicamente basados ​​únicamente en su posición al llamar a una función. Pasar parámetros de solo posición por palabras clave (nombre) no es válido.

Tomemos el siguiente ejemplo

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

Aquí, en la definición de función anterior, los parámetros a y b son solo posicionales, mientras que x o y pueden ser posicionales o palabras clave.

Las siguientes llamadas a funciones son válidas

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

Pero, la siguiente llamada de función no es válida, lo que genera una excepción TypeError ya que a, b no se pasan como argumentos posicionales sino que se pasan como palabras clave

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

TypeError: foo () tiene algunos argumentos posicionales pasados ​​como argumentos de palabras clave: 'a, b'

Muchas funciones integradas en python aceptan argumentos posicionales solo donde pasar argumentos por palabra clave no tiene sentido. Por ejemplo, la función incorporada len acepta solo un argumento posicional (solo), donde llamar a len como len (obj = "hello world") dificulta la legibilidad, consulte help (len).

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

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

Los parámetros de solo posición hacen que las funciones subyacentes de c / library sean fáciles de mantener. Permite que los nombres de parámetros de solo parámetros posicionales sean cambios en el futuro sin riesgo de romper el código del cliente que usa API

Por último, pero no menos importante, los parámetros solo posicionales nos permiten usar sus nombres para ser utilizados en argumentos de palabras clave de longitud variable. Verifique el siguiente ejemplo

>>> 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}

Los parámetros solo posicionales se explican mejor aquí en Tipos de argumentos de función en python: Parámetros solo posicionales

La sintaxis de parámetros solo posicionales se agregó oficialmente a python3.8. Pedido que hay de nuevo python3.8 - sólo argumentos posicionales

Relacionado con PEP: PEP 570 - Parámetros solo de posición de Python

neotam
fuente