Si je veux utiliser les résultats de argparse.ArgumentParser()
, qui est un Namespace
objet, avec une méthode qui attend un dictionnaire ou un objet semblable à un 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 __dict__
propriété?
Je pense que la réponse est non: __dict__
sent comme une convention pour la mise en œuvre, mais pas pour une interface, la manière __getattribute__
ou __setattr__
ou __contains__
semble être.
la source
vars()
(qui est soitlocals()
ouglobals()
), mais je ne suis pas vraiment sûr.vars()
et__dict__
/3/
version des documents (à y regarder de plus près, 3.1 à 3.4 y compris), donc la correction y est apparemment manquante.Directement de la bouche du cheval :
la source
vars(args)
me donneTypeError: 'dict' object is not callable
vars
avec une variable. Vous pouvez utiliser__builtins__.vars
pour y accéder directement oudel vars
pour arrêter de le masquer.del
. Au niveau de la portée du module,del
il fonctionnera pour «dé-masquer» les buildins.En général, je dirais "non". Cependant, cela
Namespace
m'a paru trop complexe, peut-être à partir du moment où les classes ne pouvaient pas hériter des types intégrés.D'un autre côté,
Namespace
présente une approche de l'argparse axée sur les tâches, et je ne peux pas penser à une situation qui nécessiterait de saisir le__dict__
, mais les limites de mon imagination ne sont pas les mêmes que les vôtres.la source
do_something(**args.__dict__)