python3 - ¿Cuál es la forma correcta de tratar Python argparse.Namespace() como un diccionario?
python argparse example (3)
¿Es apropiado "alcanzar" un objeto y usar su propiedad dict ?
En general, diría "no". Sin embargo, el Namespace
me ha parecido demasiado ingenioso, posiblemente desde 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 __dict__
agarrar el __dict__
, pero los límites de mi imaginación no son los mismos que los tuyos.
Si quiero usar los resultados de argparse.ArgumentParser()
, que es un objeto de Namespace
, con un método que espera un diccionario o un objeto similar a una asignación (ver collections.Mapping ), ¿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 propiedad __dict__
?
Creo que la respuesta es no: __dict__
huele como una convención para la implementación, pero no para una interfaz, la forma en que __getattribute__
o __setattr__
o __contains__
parecen ser.
Puede acceder al diccionario del espacio de nombres con vars() :
>>> import argparse
>>> args = argparse.Namespace()
>>> args.foo = 1
>>> args.bar = [1,2,3]
>>> d = vars(args)
>>> d
{''foo'': 1, ''bar'': [1, 2, 3]}
Puede modificar el diccionario directamente si lo desea:
>>> d[''baz''] = ''store me''
>>> args.baz
''store me''
Sí, está bien acceder al atributo __dict__. Es un comportamiento bien definido, probado y garantizado.
Directamente de la boca del caballo :
Si prefiere tener una vista similar a dict de los atributos, puede usar la expresión idiomática estándar de Python,
vars()
:
>>> parser = argparse.ArgumentParser() >>> parser.add_argument(''--foo'') >>> args = parser.parse_args([''--foo'', ''BAR'']) >>> vars(args) {''foo'': ''BAR''}
- La biblioteca estándar de Python, 16.4.4.6. El objeto Namespace