Comment puis-je créer un Python espace de noms (argparse.parse_args valeur)?
De manière interactive tester mon script python, je voudrais créer un Namespace
objet, semblable à ce qui serait retourné par argparse.parse_args()
.
Le moyen le plus évident,
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.parse_args()
Namespace()
>>> parser.parse_args("-a")
usage: [-h]
: error: unrecognized arguments: - a
Process Python exited abnormally with code 2
peut entraîner Python repl sortie (comme ci-dessus) sur une stupide erreur.
Donc, quelle est la façon la plus simple de créer un Python espace de noms avec une série d'attributs?
E. g., Je peux créer un dict
à la volée (dict([("a",1),("b","c")])
) mais je ne peux pas l'utiliser comme un Namespace
:
AttributeError: 'dict' object has no attribute 'a'
OriginalL'auteur sds | 2015-02-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une classe simple:
et cela fonctionnera exactement de la même manière que le
argparse
Namespace
classe quand il s'agit d'attributs:Sinon, juste importer la classe; il est disponible à partir de la
argparse
module:De Python 3.3, il est également
types.SimpleNamespace
, qui fait essentiellement la même chose:Les deux types sont distincts;
SimpleNamespace
est principalement utilisé pour lesys.implementation
attribut et la valeur de retour detime.get_clock_info()
.D'autres comparaisons:
instance_a == instance_b
est vrai si ils ont les mêmes attributs, les mêmes valeurs.__repr__
de montrer quels sont les attributs qu'ils ont.Namespace()
objets prennent en charge des tests de confinement;'attrname' in instance
est vrai si l'espace de noms instance a un attribut namendattrname
.SimpleNamespace
ne pas.Namespace()
objets ont une sans-papiers._get_kwargs()
méthode qui renvoie une liste triée de(name, value)
attributs de cette instance. Vous pouvez obtenir les mêmes pour chaque classe à l'aide desorted(vars(instance).items())
.SimpleNamespace()
est implémenté en C etNamespace()
est implémenté en Python, attribut access n'est pas le plus rapide parce que les deux utilisent le même__dict__
de stockage pour les attributs. L'égalité des essais et de la production de la représentation, sont un peu plus vite pourSimpleNamespace()
instances.non,
SimpleNamespace
n'est pas réellement utilisé parargparse
;argparse.Namespace
est un pur Python unique de la classe à la bibliothèque,types.SimpleNamespace
est la classe initialement développé poursys.implementation
et plus tard utilisé pourtime.get_clock_info()
. Il est mis en œuvre dans C.OriginalL'auteur
Il est maintenant recommandé d'utiliser SimpleNamespace l'un des types de module. Il fait la même chose que l'on a accepté la réponse, sauf qu'il sera plus rapide et d'avoir un peu plus d'objets internes comme des égaux et repr.
argparse.Namespace
met également en œuvre__repr__
et__eq__
.SimpleNamespace
est implémenté en C, mais seulement l'égalité d'essais etrepr()
sortie sera un peu plus rapide à cause de cela. Attribut d'accès est tout aussi rapide parce que les deux utilisent le même mécanisme pour stocker et rechercher des attributs.argparse.Namespace()
met également en œuvre__contains__
, de sorte que vous pouvez utiliserif something in ns_instance
, et il y a un sans-papiers._get_kwargs()
méthode;SimpleNamespace()
ne pas en avoir non plus.OriginalL'auteur
argparse documentation montrent divers exemples de ce que vous essayez de faire:
Ce n'est pas vous permettre de tester de manière interactive votre code à l'aide de la
Namespace
instance.J'ai peut-être raté quelque chose sur le "repl est morte" une partie de votre question, mais n'est-ce pas parce que le
ArgumentParser
vous utilisez est absent de laadd_argument
appel ? Je comprends que vous ne voulez pas de recréer la mêmeArgumentParser
dans votre tester, mais il pourrait être créé dans une autre méthode appelée dans le test pour être récupérées. @MartijnPieters ne peut pas juste faire créer leArgumentParser
de cette façon et puis le passer dans vous la méthode que de l'aide? " my_method_using_arg_parse(fake_namespace)OriginalL'auteur