usage python3 parser metavar float example argumentparser argument arg python dictionary duck-typing

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