Jika saya ingin menggunakan hasil argparse.ArgumentParser()
, yang merupakan Namespace
objek, dengan metode yang mengharapkan kamus atau objek seperti pemetaan (lihat collections.Mapping ), apa cara yang tepat untuk melakukannya?
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']
Apakah pantas untuk "menjangkau" suatu objek dan menggunakan __dict__
propertinya?
Saya akan berpikir jawabannya adalah: __dict__
baunya seperti konvensi untuk implementasi, tetapi tidak untuk antarmuka, cara __getattribute__
atau __setattr__
atau __contains__
tampaknya.
python
dictionary
duck-typing
Jason S
sumber
sumber
vars()
(yang merupakan salah satulocals()
atauglobals()
), tapi saya tidak begitu yakin.vars()
dan__dict__
/3/
versi dokumen (pada pemeriksaan lebih dekat, termasuk 3.1 ke 3.4), sehingga koreksi tampaknya hilang di sana.Langsung dari mulut kuda :
sumber
vars(args)
memberi sayaTypeError: 'dict' object is not callable
vars
dengan variabel. Anda dapat menggunakannya__builtins__.vars
untuk mengaksesnya secara langsung, ataudel vars
untuk berhenti membayangi.del
. Pada lingkup moduldel
akan bekerja untuk "un-shadow" builtin.Secara umum, saya akan mengatakan "tidak". Namun
Namespace
saya sudah terlalu direkayasa, mungkin sejak kelas tidak bisa mewarisi dari tipe bawaan.Di sisi lain,
Namespace
memang menyajikan pendekatan berorientasi tugas untuk argparse, dan saya tidak bisa memikirkan situasi yang akan membutuhkan untuk meraih__dict__
, tetapi batas imajinasi saya tidak sama dengan Anda.sumber
do_something(**args.__dict__)