pase de parametros

Chema Cortes pych3m4 en gmail.com
Lun Oct 19 11:02:39 CEST 2009


El día 19 de octubre de 2009 04:18,  <jlrivero en ucf.edu.cu> escribió:

> Hola, estoy un poco enredado con el pase de parámetros a funciones, he visto que se
> pasan parámetros nombrados y no nombrados, y si quiero pasr lo que sea lo hago asi:
> def func (*args, **kwd)
> Si hago def func(*arg) va a tomar lo que le pase como una tupla, y si paso def
> func(**kwd) seria un diccionario
> Pueden debatir un poco esto

Se dice que los argumentos de una función pueden ser "posicionales" o
"por clave". Los argumentos posicionales se van tomando por orden,
mientras los argumentos por clave se toman según el nombre del
argumento; la única condición es que los argumentos posicionales
tienen que ir delante de los argumentos por clave.

Por ejemplo, si defino una función así:

def MiFunc(arg1, arg2, arg3, arg4, arg5):
  print arg1,arg2, arg3, arg4, arg5

podría invocarla como

MiFunc(1,2,3,4,5)
MiFunc(arg5=5,arg4=4,arg2=2,arg3=3,arg1=1)
MiFunc(1,2,3,arg5=5,arg4=4)

Todos estos casos son equivalentes. Estaría prohibido que haya
argumentos por clave delante de los posicionales:

MiFunc(arg5=5,1,2,3,4)   #ERROR


Si el número de argumentos es variable, puedes recoger los argumentos
adicionales,  posicionales o por clave, de la siguiente manera:

def MiFunc(arg1, arg2, arg3, *args, **kwargs)
  print arg1, arg2, arg3, args, kwargs


Para invocar a esta función necesitas siempre pasar tres argumentos, y
luego los que quieras adicionales. En args (tupla) iran los argumentos
posicionales adicionales y en kwargs (diccionario) los argumentos por
clave adicionales. La única regla que tienes que cuidar al invocar la
función es que los argumentos posicionales siempre van delante de los
argumentos por clave.

Ejemplos:

MiFunc(1,2,3)  -->  arg1=1, arg2=2, arg3=3, args=(), kwargs={}
MiFunc(1,2,3,4,5) --> arg1=1, arg2=2, arg3=3, args=(4,5), kwargs={}
MiFunc(1,2,3,4,arg5=5) --> arg1=1, arg2=2, arg3=3, args=(4,), kwargs={"arg5":5}
MiFunc(1,2,arg3=3,arg4=4,arg5=5) --> arg1=1, arg2=2, arg3=3, args=(),
kwargs={"arg4":4,"arg5":5}
MiFunc(1,2,3,4,"Hola",n=5,s="Mundo") --> arg1=1, arg2=2, arg3=3,
args=(4,"Hola"), kwargs={"n":5, "s":"Mundo"}

Puedes probar tú mismo diferentes combinaciones a ver qué sale.

Si no quieres paso de argumentos variable por posición o por clave tan
sólo pon uno de los dos mecanismos:

def MiFunc(*args)   #paso de argumentos sólo por posición
def MiFunc(**kwargs)   #paso de argumentos sólo por clave


Por completar, se podría hablar de qué pasa con los argumentos con
valores por defecto y de cómo se asignan los argumentos posicionales a
tuplas, pero te lo dejo para que lo descubras por tus propios medios
(pregunta por aquí si no te aclaras).
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es