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?.
Per la documentation :
L'argument de mot-clé
type
deadd_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)
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!
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)