Tengo que ir con el señor Lott en este caso. Puede obtener rápidamente una respuesta de autoría en este caso en los documentos de Python, además tendrá una idea de qué más hay en los documentos. Le conviene conocer esos documentos si planea trabajar en Python.
Si. Puede usarlo *argscomo argumento sin palabras clave . Entonces podrá pasar cualquier número de argumentos.
def manyArgs(*arg):print"I was called with", len(arg),"arguments:", arg
>>> manyArgs(1)
I was called with1 arguments:(1,)>>> manyArgs(1,2,3)
I was called with3 arguments:(1,2,3)
Como puede ver, Python descomprimirá los argumentos como una tupla única con todos los argumentos.
Para los argumentos de palabras clave, debe aceptarlos como un argumento real separado, como se muestra en la respuesta de Skurmedel .
También es importante ... uno puede encontrar un momento en que tienen que pasar un número desconocido de argumentos a una función. En un caso como este, llame a sus "manyArgs" creando una lista llamada "args" y pasándola a manyArgs como este "manyArgs (* args)"
wilbbe01
44
Esto está cerca, pero desafortunadamente no es lo suficientemente general: manyArgs(x = 3)falla con TypeError. La respuesta de Skumedel muestra la solución a esto. El punto clave es que la firma general de una función es f(*list_args, **keyword_args)(no f(*list_args)).
Eric O Lebigot
2
El tipo de argses tuple. kwargssignifica palabra clave args . El tipo de kwargsesdictionary .
RoboAlex
1
Solo for arg in args:por iterar a través de argumentos pasados
MasterControlProgram
228
Agregando a desenrolla publicación:
También puede enviar múltiples argumentos clave-valor.
def myfunc(**kwargs):# kwargs is a dictionary.for k,v in kwargs.iteritems():print"%s = %s"%(k, v)
myfunc(abc=123, efh=456)# abc = 123# efh = 456
Y puedes mezclar los dos:
def myfunc2(*args,**kwargs):for a in args:print a
for k,v in kwargs.iteritems():print"%s = %s"%(k, v)
myfunc2(1,2,3, banan=123)# 1# 2# 3# banan = 123
Deben declararse y llamarse en ese orden, es decir, la firma de la función debe ser * args, ** kwargs y llamarse en ese orden.
No estoy seguro de cómo consiguió que myfunc (abc = 123, def = 456) funcionara, pero en el mío (2.7), 'def' no se puede pasar en esta función sin obtener un SyntaxError. Supongo que esto se debe a que def tiene significado en python. Pruebe myfunc (abc = 123, fgh = 567) en su lugar. (De lo contrario, ¡gran respuesta y gracias por eso!)
Dannid
@ Dannid: Ni idea jaja ... tampoco funciona en 2.6 o 3.2. Lo renombraré.
Skurmedel
Cuando dice 'llamado en ese orden', ¿quiere decir que pasó en ese orden? ¿O algo mas?
Nikhil Prabhu
1
@NikhilPrabhu: Sí. Los argumentos de palabras clave deben ser los últimos cuando lo llame. Siempre vienen al final si también tiene argumentos que no son palabras clave en la llamada.
Skurmedel
2
Para Python 3: simplemente intercambie print acon print(a)y kwargs.iteritems():con kwargs.items().
MasterControlProgram
22
Si puedo, el código de Skurmedel es para python 2; para adaptarla a Python 3, el cambio iteritemsde itemsy añadir paréntesis print. Eso podría evitar que los principiantes como yo se encuentren:
AttributeError: 'dict' object has no attribute 'iteritems'y busquen en otro lugar (p. Ej., El error "objeto 'dict' no tiene el atributo 'iteritems'" al intentar usar write_shp () de NetworkX por qué sucede esto.
A veces no desea especificar el número de argumentos y desea utilizar claves para ellos (el compilador se quejará si un argumento pasado en un diccionario no se usa en el método).
def manyArgs1(args):print args.a, args.b #note args.c is not used heredef manyArgs2(args):print args.c #note args.b and .c are not used hereclassArgs:pass
args =Args()
args.a =1
args.b =2
args.c =3
manyArgs1(args)#outputs 1 2
manyArgs2(args)#outputs 3
Entonces puedes hacer cosas como
myfuns =[manyArgs1, manyArgs2]for fun in myfuns:
fun(args)
Este es un código terrible. Mucho mejor sería:f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
metaperture
0
Otra forma de hacerlo, además de las buenas respuestas ya mencionadas, depende del hecho de que puede pasar argumentos nombrados opcionales por posición. Por ejemplo,
Respuestas:
Si. Puede usarlo
*args
como argumento sin palabras clave . Entonces podrá pasar cualquier número de argumentos.Como puede ver, Python descomprimirá los argumentos como una tupla única con todos los argumentos.
Para los argumentos de palabras clave, debe aceptarlos como un argumento real separado, como se muestra en la respuesta de Skurmedel .
fuente
manyArgs(x = 3)
falla conTypeError
. La respuesta de Skumedel muestra la solución a esto. El punto clave es que la firma general de una función esf(*list_args, **keyword_args)
(nof(*list_args)
).args
estuple
.kwargs
significa palabra clave args . El tipo dekwargs
esdictionary
.for arg in args:
por iterar a través de argumentos pasadosAgregando a desenrolla publicación:
También puede enviar múltiples argumentos clave-valor.
Y puedes mezclar los dos:
Deben declararse y llamarse en ese orden, es decir, la firma de la función debe ser * args, ** kwargs y llamarse en ese orden.
fuente
print a
conprint(a)
ykwargs.iteritems():
conkwargs.items()
.Si puedo, el código de Skurmedel es para python 2; para adaptarla a Python 3, el cambio
iteritems
deitems
y añadir paréntesisprint
. Eso podría evitar que los principiantes como yo se encuentren:AttributeError: 'dict' object has no attribute 'iteritems'
y busquen en otro lugar (p. Ej., El error "objeto 'dict' no tiene el atributo 'iteritems'" al intentar usar write_shp () de NetworkX por qué sucede esto.y:
fuente
Agregando a las otras publicaciones excelentes.
A veces no desea especificar el número de argumentos y desea utilizar claves para ellos (el compilador se quejará si un argumento pasado en un diccionario no se usa en el método).
Entonces puedes hacer cosas como
fuente
saldrá el código anterior
Esto es tan bueno como pasar argumentos variables por medio de un diccionario
fuente
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
Otra forma de hacerlo, además de las buenas respuestas ya mencionadas, depende del hecho de que puede pasar argumentos nombrados opcionales por posición. Por ejemplo,
Rendimientos
fuente