pythonスクリプトをインタラクティブにテストするために、argparse.parse_args()
によって返されるものに似たNamespace
オブジェクトを作成したいと思います。
_>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.parse_args()
Namespace()
>>> parser.parse_args("-a")
usage: [-h]
: error: unrecognized arguments: - a
Process Python exited abnormally with code 2
_
Python replが上記のように)愚かなエラーで終了する可能性があります。
したがって、Python指定された属性のセットを持つネームスペースを作成する最も簡単な方法は何ですか?
たとえば、dict
をその場で作成できます(dict([("a",1),("b","c")])
)が、Namespace
として使用することはできません。
_AttributeError: 'dict' object has no attribute 'a'
_
簡単なクラスを作成できます:
_class Namespace:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
_
属性に関しては、argparse
Namespace
クラスとまったく同じように機能します。
_>>> args = Namespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'
_
または、クラスをインポートするだけ; argparse
モジュールから利用可能です:
_from argparse import Namespace
args = Namespace(a=1, b='c')
_
Python 3.3の時点で、 _types.SimpleNamespace
_ もあり、これは本質的に同じことを行います:
_>>> from types import SimpleNamespace
>>> args = SimpleNamespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'
_
2つのタイプは異なります。 SimpleNamespace
は、主に_sys.implementation
_属性とtime.get_clock_info()
の戻り値に使用されます。
さらなる比較:
instance_a == instance_b
_はtrueです。__repr__
_があります。Namespace()
オブジェクトは封じ込めテストをサポートします。 _'attrname' in instance
_は、名前空間インスタンスにnamename attrname
という属性がある場合にtrueです。 SimpleNamespace
はしません。Namespace()
オブジェクトには、そのインスタンスの_(name, value)
_属性のソート済みリストを返す、文書化されていない._get_kwargs()
メソッドがあります。 sorted(vars(instance).items())
を使用して、どちらのクラスでも同じことができます。SimpleNamespace()
はCで実装され、Namespace()
はPythonで実装されますが、両方とも同じ___dict__
_ストレージを属性に使用するため、属性アクセスは高速ではありません。 SimpleNamespace()
インスタンスの場合、等価テストと表現の生成は少し高速です。TypesモジュールのSimpleNamespaceを使用することをお勧めします。それは受け入れられた答えと同じことをしますが、より速くなり、equalsやreprなどの組み込み機能がいくつかあります。
from types import SimpleNamespace
sn = SimpleNamespace()
sn.a = 'test'
sn.a
# output
'test'