propias procedimientos posicional metodos lista guardar funciones explicacion ejemplos argumento python arguments

python - procedimientos - Cómo iterar sobre argumentos de función



kwargs python explicacion (5)

Tengo una función de Python que acepta varios argumentos de cadena def foo(a, b, c): y concatenándolos en una cadena. Quiero iterar sobre todos los argumentos de la función para verificar que no sean Ninguno. ¿Cómo se puede hacer? ¿Hay una forma rápida de convertir Ninguno a ""?

Gracias.


¿Es esto quizás lo que te gustaría?

def foo(a, b, c): "SilentGhost suggested the join" '' ''.join(i if i is not None else '''' for i in vars().values()) def bar(a,b,c): "A very usefull method!" print vars() print vars().values()

Observe el uso de vars() , que devuelve un dict.


Puede usar el módulo de inspección y definir una función como esa:

import inspect def f(a,b,c): argspec=inspect.getargvalues(inspect.currentframe()) return argspec f(1,2,3) ArgInfo(args=[''a'', ''b'', ''c''], varargs=None, keywords=None, locals={''a'': 1, ''c'': 3, ''b'': 2})

en argspec hay toda la información que necesita para realizar cualquier operación con el argumento pasado.

Para concatenar la cadena es suficiente para usar la información arg recibida:

def f(a,b,c): argspec=inspect.getargvalues(inspect.currentframe()) return ''''.join(argspec.locals[arg] for arg in argspec.args)

Para referencia: http://docs.python.org/library/inspect.html#inspect.getargvalues


Yo usaría sed s / None // g, pero eso no está en python, pero probablemente puedas usar os.popen () para hacer eso.


locals() puede ser tu amigo aquí si lo llamas primera cosa en tu 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 :

El ''Ejemplo 1'' resalta que es posible que tengamos que trabajar un poco más si el orden de sus argumentos es importante ya que el dict devuelto por los locals() (o vars() ) no está ordenado. La función anterior tampoco se ocupa de 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''


def func(*args): '' ''.join(i if i is not None else '''' for i in args)

si se está uniendo en una cadena vacía, podría simplemente hacer ''''.join(i for i in args if i is not None)