Tengo una función de Python aceptar varios argumentos de la cadena de def foo(a, b, c): y la concatenación de ellos en una cadena.
Quiero iterar sobre todos los argumentos de la función para comprobar que no son Ninguno. Cómo se puede hacer?
Hay una forma rápida de convertir a Ninguno «»?

Gracias.

InformationsquelleAutor jackhab | 2010-05-26

5 Comentarios

  1. 36

    locals() puede ser su amigo si usted 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:

    ‘Ejemplo 1’ destaca que podríamos tener algo de trabajo extra si el orden de los argumentos es importante ya que el dict devuelto por locals() (o vars()) es desordenada. La función de arriba también no tratar con números muy agraciado. Así que aquí están 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'
    • Por lo que vale, creo que *args es el camino a seguir aquí… lo que si usted desea concatenar las dieciséis cuerdas? Yo sólo quería mostrar que era posible en Python usando la función de firma siempre 🙂
    • en lugar de los lugareños también puede utilizar vars().
    • Gracias por la sugerencia. locals() parece comportarse de la misma como vars() sin argumentos en este caso.
    • Lo encontré muy útil junto con una función que convierte subrayado separados por cadenas en camelcase queridos… puede ahorrar un montón de tedioso código repetitivo al crear instancias de los atributos de los objetos de la inicialización de los parámetros. Todavía estoy esperando a meterme en problemas con este estilo de programación 😛
    • Para simplificar el ejemplo, se puede ayudar a dividir las declaraciones en líneas separadas. (es decir: for k in sorted(arguments.keys()): if arguments[k] is not None: print(str(arguments[k])))
    • Vi que usted había pedido que la función que he mencionado anteriormente; no sé si usted todavía quiere ver (y no es que los grandes de todos modos) pero se encuentra aquí: github.com/dwringer/misc/blob/master/utils.py#L438-L465

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

    si va a unir en una cadena vacía, sólo pudo hacer ''.join(i for i in args if i is not None)

    • ¿Y si todos los argumentos son explícitamente declarado? Como en def foo(a, b, c):
    • re-definir su función. Esa sería la opción más fácil. Si usted tiene sólo unos pocos argumentos, se podría poner en una tupla.
    • Pero esto hace que el código sea más legible
    • ¿por qué piensas así? es idiomáticas Python. ¿Utiliza sus argumentos de forma individual? Si usted fácilmente puede desempaquetar args en variables con nombres apropiados.
    • Estoy de acuerdo con usted allí. Podría explícitamente el nombre de tus argumentos, y crear una lista de los argumentos antes de unirse (args = [a,b,c]). Tal vez una palabra clave de construcción es también una solución; entonces, usted puede obtener los valores de la kwargs dict. Palabras clave valores predeterminados puede sin embargo tener un comportamiento inesperado.
    • Empecé con Python hace dos días y no estoy seguro de entender lo que quieres decir.
    • Yo pensaba que los argumentos pasados a la función en algún tipo de diccionario y este diccionario se puede acceder a través de algunos integrado atributo o algo. EDIT: Oh! la acaba de encontrar – se llama locals()
    • no está claro cuál sería la mejor opción para usted, porque usted no es la que nos muestra cómo es exactamente lo que estamos utilizando esos argumentos. ¿Estás usando el a, b y c de alguna otra manera?
    • def func(a,b,c): args=[a,b,c] ‘ ‘.únete a(i si i no es Ninguna otra » for i in args)

  3. 2

    Puede utilizar el inspeccionar módulo y definir una función como la siguiente:

    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 necesitas para realizar cualquier operación con el argumento pasado.

    Para concatenar la cadena es suficiente para el uso de la arg información recibida:

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

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

  4. 1

    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 diccionario.

  5. -5

    Me gustaría usar sed s/Ninguno//g, pero que no está en python, pero usted probablemente puede utilizar el sistema operativo.popen() para hacerlo.

    • Lo que si SilentGhosts en Windows…..no v python….:-)
    • Creo que None significa que el objeto de python None no en el sentido literal de cadena "None"

Dejar respuesta

Please enter your comment!
Please enter your name here