web-dev-qa-db-fra.com

Quelle est la bonne façon de traiter Python argparse.Namespace () en tant que dictionnaire?

Si je veux utiliser les résultats de argparse.ArgumentParser(), qui est un objet Namespace, avec une méthode qui attend un dictionnaire ou un objet de type mappage (voir collections.Mapping ), Quelle est la bonne façon de le faire?

C:\>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import argparse
>>> args = argparse.Namespace()
>>> args.foo = 1
>>> args.bar = [1,2,3]
>>> args.baz = 'yippee'
>>> args['baz']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Namespace' object has no attribute '__getitem__'
>>> dir(args)
['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '_
_format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__
', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'ba
r', 'baz', 'foo']

Est-il approprié de "pénétrer" dans un objet et d'utiliser sa propriété __dict__?

Je pense que la réponse est non: __dict__ sent comme une convention d'implémentation, mais pas une interface, comme le semble bien __getattribute__ ou __setattr__ ou __contains__.

180
Jason S

Vous pouvez accéder au dictionnaire de l'espace de noms avec vars () :

>>> import argparse
>>> args = argparse.Namespace()
>>> args.foo = 1
>>> args.bar = [1,2,3]
>>> d = vars(args)
>>> d
{'foo': 1, 'bar': [1, 2, 3]}

Vous pouvez modifier le dictionnaire directement si vous le souhaitez:

>>> d['baz'] = 'store me'
>>> args.baz
'store me'

Oui, vous pouvez accéder à l'attribut __dict__. C'est un comportement bien défini, testé et garanti.

287

directement de la bouche du cheval :

Si vous préférez avoir une vue de type dict des attributs, vous pouvez utiliser l'idiome standard Python, vars() :

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
{'foo': 'BAR'}

- La Python Standard Library, 16.4.4.6. L'objet Namespace

45
Eugene Yarmash