Wenn ich die Ergebnisse argparse.ArgumentParser()
eines Namespace
Objekts mit einer Methode verwenden möchte , die ein Wörterbuch oder ein Mapping-ähnliches Objekt erwartet (siehe Sammlungen.Mapping ), wie gehe ich dann richtig vor?
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']
Ist es richtig, in ein Objekt zu "greifen" und seine __dict__
Eigenschaft zu nutzen?
Ich würde denken, die Antwort ist nein: __dict__
riecht nach einer Konvention für die Implementierung, aber nicht nach einer Schnittstelle, wie __getattribute__
oder __setattr__
oder wie es __contains__
scheint.
quelle
vars()
(was entwederlocals()
oder istglobals()
) bezieht , aber ich bin mir nicht wirklich sicher.vars()
und__dict__
/3/
Version der Dokumente erhalten (bei näherer Betrachtung, 3.1 bis 3.4 einschließlich), so dass die Korrektur dort anscheinend fehlt.Direkt aus dem Maul des Pferdes :
quelle
vars(args)
gibt mirTypeError: 'dict' object is not callable
vars
mit einer Variablen überschrieben . Sie können verwenden__builtins__.vars
, um direkt darauf zuzugreifen oderdel vars
das Abschatten zu beenden.del
. Im Moduldel
wird der Bereich zum "Entschatten" von eingebauten Funktionen verwendet.Im Allgemeinen würde ich "nein" sagen. Es
Namespace
hat mich jedoch als überentwickelt empfunden, möglicherweise aus der Zeit, als Klassen nicht von integrierten Typen erben konnten.Auf der anderen Seite
Namespace
präsentiert sich eine aufgabenorientierte Herangehensweise an Argparse, und ich kann mir keine Situation vorstellen, die es erforderlich machen würde, das zu ergreifen__dict__
, aber die Grenzen meiner Vorstellungskraft sind nicht die gleichen wie Ihre.quelle
do_something(**args.__dict__)