web-dev-qa-db-fra.com

Spécifiez le format des arguments d'entrée argparse python

J'ai un script python qui nécessite des entrées en ligne de commande et j'utilise argparse pour les analyser. J'ai trouvé la documentation un peu déroutante et je ne pouvais pas trouver un moyen de rechercher un format dans le fichier. Ce que je veux dire par vérification du format est expliqué dans cet exemple de script:

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__)))

J'ai besoin de vérifier l'option -s et -e que l’entrée de l’utilisateur est au format YYYY-MM-DD. Existe-t-il une option dans argparse que je ne sache pas qui accomplit cela?.

90
Sohaib

Per la documentation :

L'argument de mot-clé type de add_argument() permet d'effectuer les vérifications de type et les conversions de type nécessaires ... type= peut prendre n'importe quel objet appelable qui prend un seul argument de chaîne et renvoie la valeur convertie

Vous pourriez faire quelque chose comme:

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)

Puis utilisez cela comme type:

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

Pour ajouter à la réponse ci-dessus, vous pouvez utiliser une fonction lambda si vous souhaitez la conserver sur une ligne. Par exemple:

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

Vieux fil mais la question était toujours d'actualité pour moi du moins!

64
Evan V

Pour les autres utilisateurs de ce moteur de recherche: dans Python 3.7, vous pouvez utiliser le standard .fromisoformat méthode de classe au lieu de réinventer la roue pour les dates conformes à la norme ISO-8601, par exemple:

parser.add_argument('-s', "--startdate",
    help="The Start Date - format YYYY-MM-DD",
    required=True,
    type=datetime.date.fromisoformat)
parser.add_argument('-e', "--enddate",
    help="The End Date format YYYY-MM-DD (Inclusive)",
    required=True,
    type=datetime.date.fromisoformat)
21
Michał Górny