locals()
puede ser su amigo aquí si lo llama primero en su función.
Ejemplo 1:
>>> def fun(a, b, c):
... d = locals()
... e = d
... print e
... print locals()
...
>>> fun(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}
{'a': 1, 'c': 3, 'b': 2, 'e': {...}, 'd': {...}}
Ejemplo 2:
>>> def nones(a, b, c, d):
... arguments = locals()
... print 'The following arguments are not None: ', ', '.join(k for k, v in arguments.items() if v is not None)
...
>>> nones("Something", None, 'N', False)
The following arguments are not None: a, c, d
respuesta:
>>> def foo(a, b, c):
... return ''.join(v for v in locals().values() if v is not None)
...
>>> foo('Cleese', 'Palin', None)
'CleesePalin'
actualización:
destacado 'Ejemplo 1' para que tengamos un poco de trabajo extra para hacer si el orden de los argumentos es importante como el devuelto por dict
locals()
(o vars()
) es desordenada. La función anterior tampoco trata los números con mucha gracia. Así que aquí hay un par de mejoras:
>>> def foo(a, b, c):
... arguments = locals()
... return ''.join(str(arguments[k]) for k in sorted(arguments.keys()) if arguments[k] is not None)
...
>>> foo(None, 'Antioch', 3)
'Antioch3'
FWIW, creo que '* args' es el camino a seguir aquí ... ¿y si quieres concatenar dieciséis cuerdas? Solo quería mostrar que era posible en Python usando la firma de función proporcionada :-) – Johnsyweb
en lugar de los locales, también puedes usar vars(). – extraneon
@extraneon Gracias por el consejo. 'locals()' parece comportarse igual que 'vars()' sin argumentos en este caso. – Johnsyweb