En las siguientes definiciones de métodos, ¿qué hace el *y **para param2?
def foo(param1, *param2):
def bar(param1, **param2):El *argsand **kwargses un modismo común para permitir un número arbitrario de argumentos a las funciones como se describe en la sección más detallada sobre la definición de funciones en la documentación de Python.
Le *argsdará todos los parámetros de la función como una tupla :
def foo(*args):
for a in args:
print(a)
foo(1)
# 1
foo(1,2,3)
# 1
# 2
# 3
El **kwargsle dará todos los argumentos de palabras clave excepto los correspondientes a un parámetro formal como un diccionario.
def bar(**kwargs):
for a in kwargs:
print(a, kwargs[a])
bar(name='one', age=27)
# name one
# age 27
Ambos modismos se pueden mezclar con argumentos normales para permitir un conjunto de argumentos fijos y algunos variables:
def foo(kind, *args, **kwargs):
pass
También es posible usar esto al revés:
def foo(a, b, c):
print(a, b, c)
obj = {'b':10, 'c':'lee'}
foo(100,**obj)
# 100 10 lee
Otro uso del *lmodismo es desempaquetar listas de argumentos al llamar a una función.
def foo(bar, lee):
print(bar, lee)
l = [1,2]
foo(*l)
# 1 2
En Python 3, es posible usar *len el lado izquierdo de una tarea ( Extended Iterable Unpacking ), aunque da una lista en lugar de una tupla en este contexto:
first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]
También Python 3 agrega una nueva semántica (consulte PEP 3102 ):
def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
pass
Dicha función acepta solo 3 argumentos posicionales, y todo lo que *sigue solo se puede pasar como argumentos de palabras clave.
Un Python dict, utilizado semánticamente para pasar argumentos de palabras clave, se ordena arbitrariamente. Sin embargo, en Python 3.6, se garantiza que los argumentos de palabras clave recuerdan el orden de inserción.
"El orden de los elementos en **kwargsnow corresponde al orden en que se pasaron los argumentos de palabras clave a la función". - Novedades en Python 3.6
De hecho, todos los dictados en CPython 3.6 recordarán el orden de inserción como un detalle de implementación, esto se vuelve estándar en Python 3.7.