usage python3 parser parse float example ejemplo argumentparser argument arg python python-2.7 argparse

python3 - argparse python ejemplo



Especificar el formato para los argumentos de entrada argparse python (2)

Tengo una secuencia de comandos python que requiere algunas entradas de línea de comandos y estoy usando argparse para analizarlas. Encontré la documentación un poco confusa y no pude encontrar una forma de verificar el formato en los parámetros de entrada. Lo que quiero decir al verificar el formato se explica con este script de ejemplo:

parser.add_argument(''-s'', "--startdate", help="The Start Date - format YYYY-MM-DD ", required=True) parser.add_argument(''-e'', "--enddate", help="The End Date format YYYY-MM-DD (Inclusive)", required=True) parser.add_argument(''-a'', "--accountid", type=int, help=''Account ID for the account for which data is required (Default: 570)'') parser.add_argument(''-o'', "--outputpath", help=''Directory where output needs to be stored (Default: '' + os.path.dirname(os.path.abspath(__file__)))

Necesito verificar las opciones -s y -e que la entrada del usuario está en el formato YYYY-MM-DD . ¿Existe una opción en argparse que no sé de qué se trata?


Por la documentación :

El argumento de palabra clave de type de add_argument() permite realizar cualquier comprobación de tipo necesaria y conversiones de type= ... type= puede tomar cualquier elemento invocable que tome un argumento de cadena única y devuelva el valor convertido

Podrías hacer algo como:

def valid_date(s): try: return datetime.strptime(s, "%Y-%m-%d") except ValueError: msg = "Not a valid date: ''{0}''.".format(s) raise argparse.ArgumentTypeError(msg)

Luego usa eso como type :

parser.add_argument("-s", "--startdate", help="The Start Date - format YYYY-MM-DD", required=True, type=valid_date)


Solo para agregar a la respuesta anterior, puede usar una función lambda si desea mantenerla en una sola línea. Por ejemplo:

parser.add_argument(''--date'', type=lambda d: datetime.strptime(d, ''%Y%m%d''))

Viejo hilo, pero la pregunta todavía era relevante para mí al menos!