Si quiero usar los resultados de argparse.ArgumentParser()
, que es un Namespace
objeto, con un método que espera un diccionario o un objeto similar al mapeo (ver colecciones.Mapa ), ¿cuál es la forma correcta de hacerlo?
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']
¿Es apropiado "alcanzar" un objeto y usar su __dict__
propiedad?
Yo creo que la respuesta es no: __dict__
huele a una convención para la implementación, pero no para una interfaz, la forma __getattribute__
o el __setattr__
o __contains__
parecen ser.
python
dictionary
duck-typing
Jason S
fuente
fuente
vars()
(que eslocals()
oglobals()
) o , pero no estoy realmente seguro.vars()
y__dict__
/3/
versión de los documentos (en una inspección más cercana, 3.1 a 3.4 incluidos), por lo que aparentemente la corrección falta allí.Directamente de la boca del caballo :
fuente
vars(args)
me daTypeError: 'dict' object is not callable
vars
con una variable. Puede usarlo__builtins__.vars
para acceder directamente odel vars
para dejar de seguirlo.del
. En el alcance del módulodel
, funcionará para "quitar la sombra" de las construcciones.En general, diría "no". Sin embargo,
Namespace
me ha parecido una ingeniería excesiva, posiblemente de cuando las clases no podían heredar de los tipos incorporados.Por otro lado,
Namespace
presenta un enfoque orientado a tareas para argparse, y no puedo pensar en una situación que requiera agarrar__dict__
, pero los límites de mi imaginación no son los mismos que los suyos.fuente
do_something(**args.__dict__)