usage parser mutually metavar float exclusive example ejemplo argumentparser argument python dictionary argparse

mutually - python argparse argumentparser()



Aceptar un diccionario como argumento con argparse y python (1)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de aceptar un argumento de tipo = dict con argparse pero sin importar la entrada, da un error de valor de dict inválido.

#!/usr/bin/env python import argparse MYDICT = {''key'': ''value''} parser = argparse.ArgumentParser() parser.add_argument("-m", "--mydict", action="store", required=False, type=dict, default=MYDICT) args = parser.parse_args() print args.mydict

Esto es lo que sucede cuando intento pasar un diccionario al script.

./argp.py -m "{''key1'': ''value1''}" usage: argp.py [-h] [-m MYDICT] argp.py: error: argument -m/--mydict: invalid dict value: "{''key1'': ''value1''}"

Mirando los documentos pensaría que esto sería posible.

http://docs.python.org/dev/library/argparse.html

"Cualquier objeto que admita el operador in puede pasarse como valor de elección, por lo que se admiten los objetos dict, los objetos establecidos, los contenedores personalizados, etc.".


No creo que sea posible pasar un diccionario como un argumento en la línea de comando porque no existe una función de conversión de cadena a dict ( EDITAR : es posible un corte, ver más abajo). Lo que básicamente le estás diciendo a Python que haga es:

dict("{''key1'': ''value1''}")

Que si lo pruebas en la consola de python, no funciona.

Cual es la frase

"Cualquier objeto que admita el operador in puede pasarse como valor de elección, por lo que se admiten los objetos dict, los objetos establecidos, los contenedores personalizados, etc.".

se refiere al argumento de opciones que se puede pasar con la función add_argument , no al argumento de tipo .

Su mejor apuesta es probablemente aceptar su argumento como una cadena y luego convertirlo usando las capacidades json de python:

parser.add_argument(''-m'', ''--my-dict'', type=str) args = parser.parse_args() import json my_dictionary = json.loads(args.my_dict)

A continuación, puede pasar un diccionario en forma de una cadena. Puedes probar el codificador / decodificador json por ti mismo en la consola de Python para ver cómo funciona:

>>>json.loads(''{"value1":"key1"}'') {u''value1'': u''key1''}

EDIT : hpaulj me ha señalado que puede "hackear" el parámetro de tipo pasándolo json.loads .

import json parser.add_argument(''-d'', ''--my-dict'', type=json.loads) args = parse.parse_args() mydict = args.my_dict # Will return a dictionary

La razón por la que esto funciona es bastante interesante porque internamente argparse solo usará el valor del parámetro como una función para convertir el argumento. es decir, si type = int entonces usará int (arg) o si type = json.loads entonces json.loads (arg)

Esto también significa que puede pasar cualquier función que tome un solo parámetro como argumento para escribir y realizar conversiones personalizadas si es necesario: