Me he encontrado con la necesidad de llamar a un ejecutable externo utilizando el módulo de subproceso. Todo funciona bien, sin embargo, me gustaría mejorar cómo estoy generando los argumentos de la línea de comandos.

Las opciones de la línea de comandos del ejecutable requieren el siguiente formato: --argname = argvalue

Actualmente tengo una lista de diccionarios de la siguiente manera: [{arg1: value1}, {arg2: value2}]

¿Cuál es el mejor método para expandir estos diccionarios a su formato de cadena adecuado? Actualmente estoy iterando sobre la lista, agregando una lista diferente, sin embargo, siento que hay un método más pitónico que debería utilizar.

0
Ryan 9 may. 2016 a las 23:55

4 respuestas

La mejor respuesta

¿Qué tal

def format_dict(d):
    key = d.keys()[0]
    return '--%s=%s' % (key, d[key])

ex = [{'a':'3'}, {'b':'4'}]
print ' '.join(map(format_dict, ex)) # --a=3 --b=4
0
hunminpark 9 may. 2016 a las 21:07
' '.join('--{key}={value}'.format(key = k, value = v) for d in arg_list for k, v in d.items())

Esencialmente, esto itera sobre cada diccionario en la lista (for d in arg_list) y luego itera sobre los elementos en cada diccionario (for k, v in d.items()). Cada elemento se formatea en la forma adecuada, y luego todos esos pares clave-valor se combinan.

Es equivalente a:

arg_list = [{arg1:value1},{arg2:value2}]
formatted_args = []

for d in arg_list:
    for k, v in d.items():
        # Format each item per dictionary
        formatted_args.append('--{key}={value}'.format(key = k, value = v))

# Combine the arguments into one string
args_string = ' '.join(formatted_args)
1
Rushy Panchal 9 may. 2016 a las 21:10

Utilice items() como en http://docs.quantifiedcode.com /python-code-patterns/readability/not_using_items_to_iterate_over_a_dictionary.html

for key,val in d.items():
    print("{} = {}".format(key, val))
1
Bill Seitz 9 may. 2016 a las 21:07

Prueba esto

 ','.join('{}={}'.format(k, v) for d in arg_list for k, v in d.items())
1
Anoop 9 may. 2016 a las 21:24