python ConfigArgParse Remarque ~ Gérez-vous toujours les arguments et les fichiers de configuration séparément? ~

C'était gênant de gérer séparément les arguments de la ligne de commande et les paramètres du fichier de configuration, donc j'ai pensé qu'il serait bien de trouver un analyseur capable de gérer les deux à la fois, alors je l'ai vérifié.

ConfigArgParse https://github.com/bw2/ConfigArgParse

Est-il utilisé?

S'il n'est pas trop utilisé, ce sera EOL, alors vérifiez-le légèrement

~$ apt-cache rdepends python3-configargparse
python3-configargparse
Reverse Depends:
  python3-certbot
  snakemake
  bdfproxy
  python3-azure-devtools
  prometheus-pgbouncer-exporter
  cloudprint

Le plus important est "cerbot" qui est un client de Let's Encrypt, ou "bdfproxy" pour les gens de sécurité, n'est-ce pas?

Formats pris en charge

Vérifiez également les formats pris en charge.

# how to specify a key-value pair (all of these are equivalent):
name value     # key is case sensitive: "Name" isn't "name"
name = value   # (.ini style)  (white space is ignored, so name = value same as name=value)
name: value    # (yaml style)
--name value   # (argparse style)

Vérifiez que le séparateur d'espace, le format .ini et le format yaml sont pris en charge par défaut. J'étais content s'il y avait un format json si possible, mais c'est bien car il correspond au style yaml le plus utilisé dans un rayon de 5 m.

Installation

L'environnement de test est ubuntu 19.04 La dernière version est la 0.14.0 (13 janvier 2019) en amont à partir du 1er octobre 2019, mais je ne veux pas considérer les correctifs de sécurité, etc. en fonctionnement, donc j'utiliserai le package de la distribution ci-dessus.

$ sudo apt install python3-configargparse
$ dpkg -l python3-configargparse
Demande=(U)inconnue/(I)Installation/(R)Effacer/(P)完全Effacer/(H)Rétention
|Statut=(N)Rien/(I)installée/(C)Réglage/(U)Déploiement/(F)Réglage失敗/(H)Semi-installé/(W)
|/Erreur?=(Vide)Rien/(R)Réinstallation requise(Statut,Majuscule d'erreur=Anormal)
||/Nom Version Architecte Description
+++-======================-============-============-===========================
ii python3-configargparse 0.13.0-1 all replacement for argparse wi
lines 1-6/6 (END)

Code de test

#!/usr/bin/env python3

import configargparse

def parse_args():
    cp = configargparse.ArgumentParser(
        default_config_files=['./.arg_parse.yaml']
    )
    cp.add_argument(
        '-c', '--conf',
        dest='config',
        is_config_file=True,
        help='config file path',
    )
    cp.add_argument(
        '-f', '--flag',
        dest='flag',
        action="store_true",
        help='true or false flag'
    )
    cp.add_argument(
        '-s', '--str',
        type=str,
        required=True,
        dest='string',
        help='requirement string'
    )
    cp.add_argument(
        '-i', '--int',
        type=int,
        dest='intager',
        default=50,
        help='default intager',
    )
    cp.add_argument(
        '-a', '--array',
        dest='array',
        action='append',
        default=[],
        help='array parama',
    )
    return cp.parse_args()
              
def main():
    args = parse_args()
    print(args)

main()

Fichier de configuration (exemple de format yaml)

$ cat .arg_parse.yaml
str: hogehoge
int: 3
array: [1, 12, 35, 40]

Résultat d'exécution 1 Fichier de configuration uniquement

$ ./test_conf.py
Namespace(array=['1', '12', '35', '40'], config=None, flag=False, intager=3, string='hogehoge')

Résultat d'exécution 2 Lorsque le fichier de configuration et l'argument de ligne de commande sont utilisés

$ ./test_conf.py -i 1111 -s fugafuga -f
Namespace(array=['1', '12', '35', '40'], config=None, flag=True, intager=1111, string='fugafuga')

Divers points

  1. Le nom du paramètre du fichier de configuration est la partie "int" de "--int" et n'est pas le "intager" spécifié par dest.
  2. Lorsque le type int est utilisé, il est traité comme une chaîne de caractères sauf si "type = int" est entré. De même, si vous souhaitez spécifier le type str, vous devez utiliser "type = str". Je pensais que c'était le cas, mais même si je mets un nombre dans l'argument, il est traité comme une chaîne de caractères.
  3. "action = 'append'" est requis lors de l'utilisation de list comme argument.
  4. Lorsque vous utilisez une valeur booléenne comme argument, "action = 'store_true'" ou "action = 'store_false'" est requis.

"Store_true" est défini par défaut sur "False" et "store_false" sur "True". J'étais confus quant à savoir si c'était le contraire, mais il semble bon de penser qu'il sera respectivement Vrai et Faux lorsqu'il est spécifié par des arguments de ligne de commande.

Impressions

Je pense que c'est bien de gérer argparse et configparse séparément et de ne pas être accro à n'en changer qu'un.

Recommended Posts

python ConfigArgParse Remarque ~ Gérez-vous toujours les arguments et les fichiers de configuration séparément? ~
Que comparez-vous avec Python et ==?
Remarques sur l'écriture des fichiers de configuration pour Python Remarque: configparser
python Remarque: déterminez si l'argument de ligne de commande est dans la liste