Si quiero usar los resultados de argparse.ArgumentParser(), que es un Namespaceobjeto, 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 callablevarscon una variable. Puede usarlo__builtins__.varspara acceder directamente odel varspara 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,
Namespaceme ha parecido una ingeniería excesiva, posiblemente de cuando las clases no podían heredar de los tipos incorporados.Por otro lado,
Namespacepresenta 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__)