En la siguiente definición de función, ¿qué representan * y / ?
def func(self, param1, param2, /, param3, *, param4, param5): print(param1, param2, param3, param4, param5)NOTA: No confundir con los asteriscos simples|dobles en *args | **kwargs ( resuelto aquí )
Como se menciona en los documentos , la barra inclinada es solo para argumentos posicionales, como dice la documentación:
Hay una nueva sintaxis de parámetro de función
/para indicar que algunos parámetros de función deben especificarse posicionalmente y no pueden usarse como argumentos de palabra clave. Esta es la misma notación que muestrahelp()para las funciones de C anotadas con la herramienta Argument Clinic de Larry Hastings.
Y para el asterisco, se menciona aquí en los documentos :
Para un parámetro con un valor predeterminado, el argumento correspondiente se puede omitir de una llamada, en cuyo caso se sustituye el valor predeterminado del parámetro. Si un parámetro tiene un valor predeterminado, todos los parámetros siguientes hasta el "
*" también deben tener un valor predeterminado; esta es una restricción sintáctica que no está expresada por la gramática.
def func(self, param1, param2, /, param3, *, param4, param5): print(param1, param2, param3, param4, param5)Entonces, las formas de llamar a esto serían:
obj.func(10, 20, 30, param4=50, param5=60)Y:
obj.func(10, 20, param3=30, param4=50, param5=60)Hay una nueva sintaxis de parámetro de función / para indicar que algunos parámetros de función deben especificarse posicionalmente y no pueden usarse como argumentos de palabras clave. [ Esto es nuevo en Python 3.8 ]
La documentación especifica algunos de los casos de uso/beneficios de los parámetros solo posicionales
Permite que las funciones puras de Python emulen completamente los comportamientos de las funciones codificadas en C existentes. Por ejemplo, la función
pow()incorporada no acepta argumentos de palabras clave:def pow(x, y, z=None, /): "Emulate the built in pow() function" r = x ** y return r if z is None else r%zOtro caso de uso es excluir argumentos de palabras clave cuando el nombre del parámetro no es útil. Por ejemplo, la función
len()incorporada tiene la firmalen(obj, /). Esto evita llamadas incómodas como:len(obj='hello') # The "obj" keyword argument impairs readabilityOtro beneficio de marcar un parámetro como solo posicional es que permite cambiar el nombre del parámetro en el futuro sin riesgo de romper el código del cliente. Por ejemplo, en el módulo de estadísticas, el nombre del parámetro dist puede cambiarse en el futuro. Esto fue posible con la siguiente especificación de función:
def quantiles(dist, /, *, n=4, method='exclusive') ...
Donde como * se usa para obligar a la persona que llama a usar argumentos con nombre . Este es uno de los casos de uso de argumentos con nombre.
Entonces, dado el método,
def func(self, param1, param2, /, param3, *, param4, param5): print(param1, param2, param3, param4, param5)Debe llamar con
obj.func(10, 20, 30, param4=50, param5=60)o
obj.func(10, 20, param3=30, param4=50, param5=60)es decir,
param1 , param2 debe especificarse posicionalmente .param3 se puede llamar con posicional o palabra clave .param4 y param5 deben llamarse con un argumento de palabra clave .MANIFESTACIÓN:
>>> class MyClass(object): ... def func(self, param1, param2, /, param3, *, param4, param5): ... return param1, param2, param3, param4, param5 ... >>> obj = MyClass() >>> >>> assert obj.func(10, 20, 30, param4=40, param5=50), obj.func( ... 10, 20, param3=30, param4=40, param5=50 ... )