Re: pase de parametros

Chema Cortes <[email protected]>
Newsgroups gmane.comp.python.general.castellano
Message-ID <[email protected]>
El día 19 de octubre de 2009 04:18,  <[email protected]> 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.