web-dev-qa-db-ja.com

Python名前空間(argparse.parse_args値)を作成するにはどうすればよいですか?

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'
_
40
sds

簡単なクラスを作成できます:

_class Namespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
_

属性に関しては、argparseNamespaceクラスとまったく同じように機能します。

_>>> 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()の戻り値に使用されます。

さらなる比較:

  • 両方のクラスが同等性テストをサポートしています。同じクラスの2つのインスタンスについて、それらが同じ値を持つ同じ属性を持つ場合、_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()インスタンスの場合、等価テストと表現の生成は少し高速です。
84
Martijn Pieters

TypesモジュールのSimpleNamespaceを使用することをお勧めします。それは受け入れられた答えと同じことをしますが、より速くなり、equalsやreprなどの組み込み機能がいくつかあります。

from types import SimpleNamespace

sn = SimpleNamespace()
sn.a = 'test'
sn.a

# output
'test'
5
Mitchell Walls