¿Qué significa la barra inclinada cuando help() enumera las firmas de los métodos?

7 minutos de lectura

Avatar de usuario de Joschua
Josué

Lo que hace el / media en Python 3.4 help salida para range antes 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.

                                        ...

Avatar de usuario de Martijn Pieters
Martijn Pieters

Significa el final de la solo posicional parámetrosparámetros que no puedo usar como parámetros de palabra clave. Antes de Python 3.8, dichos parámetros solo se podían especificar en la API de C.

significa el key argumento a __contains__ solo se puede pasar por posición (range(5).__contains__(3)), no como un argumento de palabra clave (range(5).__contains__(key=3)), algo que usted poder hacer con argumentos posicionales en funciones de Python puro.

También vea el Clínica de argumentos documentación:

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 parámetros.

y la (muy reciente adición a) la Preguntas frecuentes sobre Python:

Una barra inclinada en la lista de argumentos de una función indica 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 es parte de la especificación del lenguaje Python, a partir de la versión 3.8ver 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 de Python puro 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.

  • Un efecto secundario interesante es que los nombres de los argumentos únicamente posicionales no entran en conflicto con **kwargsque puede ser útil para la programación funcional o las funciones de decoración donde los nombres de los argumentos del decorador pueden entrar en conflicto con los argumentos de la función decorada.

    – Hugodberg

    19 de diciembre de 2021 a las 14:22

  • ¡Explicaste qué, no por qué! Debería mencionar por qué esto es útil, y como @hugovdberg dijo anteriormente, se trata de no entrar en conflicto con **kwargs

    –Marcos Pereira

    27 de enero a las 13:24

  • @MarcosPereira: la pregunta hecha qué: ¿Qué significa la barra inclinada en la salida de ayuda ()?.

    – Martijn Pieters

    27 de enero a las 13:42

  • “Por qué” es una pregunta completamente separada (una para la que nunca he visto una respuesta completamente convincente).

    – Chepner

    27 de enero a las 14:13

  • @hugovdberg: Estuve confundido allí por un tiempo, pero estás hablando del func parámetro en la firma de delay_call2()donde funciona una llamada en la línea 50 porque el func (palabra clave) argumento no entrará en conflicto con el func parámetro. Sí, este es un feliz efecto secundario de la sintaxis, antes de tener que usar *args y desempaquetar el argumento asignado a la func parámetro de eso. Generalmente: los nombres en la firma de la función son parámetros, los valores pasados ​​en una expresión de llamada son los argumentos. Hace que sea más fácil hablar sobre la sintaxis utilizada en los dos lados de las llamadas.

    – Martijn Pieters

    28 de enero a las 14:04


Yo mismo hice esta pregunta. 🙂 Descubrió que / fue propuesto originalmente por Guido en aquí.

Propuesta alternativa: ¿qué tal usar “https://stackoverflow.com/”? Es algo así como lo contrario de ‘*’, que significa “argumento de palabra clave”, y “https://stackoverflow.com/” no es un carácter nuevo.

Entonces su propuesta ganado.

je. Si eso es cierto, mi propuesta “https://stackoverflow.com/” 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 positional-only si los nombres no importan o no tienen significado, y solo hay unos pocos argumentos que siempre se pasarán en el mismo orden. Use solo palabras clave cuando los nombres tengan significado y la definición de la función sea más comprensible al ser explícito con los nombres.


Si la función termina con /

def foo(p1, p2, /)

Esto significa que todos los argumentos funcionales son posicionales.

  • Elegir el / token, porque “es la operación inversa de *” muestra que Python está un poco loco. Es una especie de sinestesia.

    – Tomasz Gandor

    30 de noviembre de 2019 a las 6:28

avatar de usuario de neotam
neotam

La barra diagonal (/) indica que todos los argumentos anteriores son solo argumentos posicionales. La función de argumentos posicionales solo se agregó en python 3.8 después de PEP 570 Fue aceptado. Inicialmente esta notación se definió en PEP 457 – Notación para notación de parámetros solo posicionales

Los parámetros en la definición de función antes de la barra inclinada (/) son solo posicionales y los parámetros seguidos de una barra inclinada (/) pueden ser de cualquier tipo según la sintaxis. Donde los argumentos se asignan a parámetros posicionales únicamente en función de su posición al llamar a una función. Pasar parámetros solo posicionales 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 de palabra 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 a la 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 palabra clave

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

TypeError: foo () obtuvo algunos argumentos solo posicionales pasados ​​​​como argumentos de palabras clave: ‘a, b’

Muchas funciones integradas en python aceptan solo argumentos posicionales donde pasar argumentos por palabra clave no tiene sentido. Por ejemplo función incorporada Len acepta solo un argumento posicional (solo), donde llamar a len como len (obj = “hello world”) perjudica la legibilidad, verifique 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 solo posicionales 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 se cambien 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 usarlos en argumentos de palabras clave de longitud variable. Compruebe 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}

La sintaxis de parámetros solo posicionales se agregó oficialmente a python3.8. Verificar Novedades de python3.8: solo argumentos posicionales

Relacionado con PEP: PEP 570 — Parámetros solo posicionales de Python

¿Ha sido útil esta solución?