Python argparse dict arg
Je veux recevoir une dict(str -> str)
argument de la ligne de commande. Ne argparse.ArgumentParser
fournir? Ou toute autre bibliothèque?
Pour la ligne de commande:
program.py --dict d --key key1 --value val1 --key key2 --value val2
J'attends le dictionnaire suivant:
d = {"key1": "val1", "key2": "val2"}
Faites-vous l'argument de l'analyse ou de quoi? De la collecte à un dict ne semble pas vraiment significatif.
Oui. J'analyse le d argument. Pourquoi des listes d'arguments, et les dictionnaires ne peut pas..
Les Arguments peuvent être très complexes. Il peut être facultatif ou obligatoire, de position ou non de position, en fonction du besoin de la valeur ou de ne-pas-besoin-de la valeur. Je pense ajouter
Que diriez - cette approche?
ne serait-il pas mieux que
Oui. J'analyse le d argument. Pourquoi des listes d'arguments, et les dictionnaires ne peut pas..
Les Arguments peuvent être très complexes. Il peut être facultatif ou obligatoire, de position ou non de position, en fonction du besoin de la valeur ou de ne-pas-besoin-de la valeur. Je pense ajouter
dict
soutien rendrait les choses encore plus compliquées.Que diriez - cette approche?
ne serait-il pas mieux que
program.py --opt1 k1=v1,k2=v2,k3=v3
?OriginalL'auteur orion_tvv | 2015-05-01
Vous devez vous connecter pour publier un commentaire.
Voici une autre solution à l'aide d'un action personnalisée, si vous souhaitez spécifier dict ensemble des paires de clés séparés par des virgules --
En cours d'exécution:
De sortie:
Si vous souhaitez utiliser nargs au lieu d'séparées par des virgules:
De course
Sorties:
Sous-évalué réponse. Hélas, j'ai déjà donné ce que tout l'amour que j'ai à donner.
OriginalL'auteur
Je voudrais utiliser quelque chose comme ceci:
Vous pouvez créer une action personnalisée qui serait "annexer" a analysé paire clé-valeur directement dans un dictionnaire, plutôt que de simplement en train d'accumuler une liste de
(key, value)
des n-uplets. (Qui je vois est ce que skyline75489 n'; ma réponse diffère en utilisant un seul--keyvalue
option avec un type personnalisé au lieu de séparer les--key
et--value
options pour spécifier les paires.)Je vous conseille d'utiliser
kv.split("=", 1)
pour permettre=
de la valeur et de s'assurer que vous avez plus de 2 éléments.Aussi:
if any(len(kv) < 2 for kv in args.keyvalues): raise ValueError('Values must be given in the form "KEY=VALUE"')
OriginalL'auteur
Python reçoit des arguments sous la forme d'un tableau
argv
. Vous pouvez l'utiliser pour créer le dictionnaire dans le programme lui-même.Pour la ligne de commande:
De sortie:
J'espère que cela aide.
ce que j'ai donné n'est pas la seule solution, le point est que vous avez une liste d'arguments - ['cle1', 'val1', 'cle2', 'val2', 'cle3', 'val3'], donc peut obtenir dict avec toute logique, par exemple: chaque élément (dis pos 'i') est la clé et la valeur qu'il sera au pos (i+1), alors il suffit d'exécuter la boucle avec une taille de pas de 2 et de stocker le dictionnaire.
OriginalL'auteur
Python d'une ligne argparse dictionnaire des arguments argparse_dictionary.py
OriginalL'auteur
Directement de l'analyse d'une entrée comme:
est:
qui devrait produire (si mon mental de l'analyseur est correct)
Vous devriez être en mesure de construire un dictionnaire de que avec:
À l'aide de
args.dict
à assigner à une variable de ce nom nécessite des nations unies-python supercherie. Le mieux serait de créer un élément dans un autre dictionnaire avec ce nom.Cette solution ne permet plus d'effectuer beaucoup de vérification d'erreur. Par exemple, il n'est pas assurez-vous qu'il y a le même nombre de clés et de valeurs. Elle aussi ne serait pas vous permettre de créer plusieurs dictionnaires (c'est à dire répétées
--dict
arguments). Il ne nécessite pas une ordonnance spéciale.--dict
pourrait se produire après un--key key1
paire. Plusieurs--value
arguments pourraient être ensemble.Liant les
key=value
ensemble commechepner
ne reçoit autour d'un certain nombre de ces problèmes.OriginalL'auteur
Comme pour les bibliothèques comme argparse, docopt et cliquez sur, aucun d'entre eux en charge l'utilisation de
dict
args. La meilleure solution je pense est de faire un customargparse.Action
pour la soutenir vous-même:OriginalL'auteur