1. ホーム
  2. python

[解決済み] Pythonの名前空間(argparse.parse_argsの値)を作成するにはどうすればよいですか?

2022-03-10 11:12:44

質問

Python スクリプトをインタラクティブにテストするために、私は Namespace オブジェクトを返します。 argparse.parse_args() . 明白な方法です。

>>> 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() .

さらに比較する。

  • どちらのクラスも、同じクラスの2つのインスタンスについて、等値性テストをサポートしています。 instance_a == instance_b は、同じ属性で同じ値を持つ場合に真となります。
  • どちらのクラスも、役に立つ __repr__ を使用して、どのような属性を持っているかを示します。
  • Namespace() オブジェクトは封じ込めテストに対応しています。 'attrname' in instance は、名前空間インスタンスが属性 namend を持つ場合、真となります。 attrname . SimpleNamespace はしません。
  • Namespace() オブジェクトには、文書化されていない ._get_kwargs() のソートされたリストを返すメソッドです。 (name, value) の属性は、そのインスタンスの どちらのクラスでも、同じものを得るには sorted(vars(instance).items()) .
  • 一方 SimpleNamespace() はC言語で実装され Namespace() がPythonで実装されている場合、属性アクセスはどちらも同じ __dict__ ストレージに保存されます。等値性テストと表現の生成は SimpleNamespace() インスタンスになります。