argparseのNamespaceオブジェクト
https://docs.python.org/ja/3/library/argparse.html#the-namespace-object
#argparse
parse_args() が属性を格納して返すためのオブジェクトにデフォルトで使用されるシンプルなクラスです。
パーサのparse_argsメソッド呼び出しで返る型
このクラスはシンプルに設計されており、単に読みやすい文字列表現を持った object のサブクラスです。
実装を見ると、ベースクラスの_AttributeHolderで「読みやすい文字列表現」が実装されている
Abstract base class that provides __repr__.
https://github.com/python/cpython/blob/3.10/Lib/argparse.py#L116-L129
str.isidentifier(識別子)の場合、'%s=%r'の形式とする実装
もし属性を辞書のように扱える方が良ければ、標準的な Python のイディオム vars() を利用できます:
vars(args)で{'foo': 'BAR'}のような辞書になる
varsで辞書にすれば**で展開して引数として渡せる!
Python 組み込み関数 vars
#kfp で生成したコードにargparseをvarsと使っていることに気づいた
https://github.com/kubeflow/pipelines/blob/1.8.13/sdk/python/kfp/components/_python_op.py#L700
https://github.com/kubeflow/pipelines/blob/1.8.13/sdk/python/kfp/components/_python_op.py#L749
実装でも使っている
https://github.com/python/cpython/blob/3.10/Lib/argparse.py#L1288-L1305
__eq__の実装はvars(self) == vars(other)
別の例:argparse自体のテストコード
テストのアサーションとしては、以下2点でもいいのかも
Namespaceオブジェクトである
varsで辞書を返させて、辞書の一致の検証
これだと要素の不一致もわかりやすいのでは?(未検証)
既存のオブジェクトに属性を設定する方が良い場合
namespace= キーワード引数を指定する
Namespaceどうしは__eq__で比較できる実装
https://github.com/python/cpython/blob/v3.10.5/Lib/argparse.py#L1288-L1305
テストのアサーションはNamespaceオブジェクトどうしの比較でも書けそう
code:NSオブジェクトの続き.py
>> args
Namespace(string='spam', number=42)
>> from argparse import Namespace
>> args == Namespace(number=42, string="spam")
True
ドキュメントから記載が消えたっぽい
デフォルトでは、 parse_args() は Namespace の新しいオブジェクトに必要な属性を設定して返します。
なんだかPython types.SimpleNamespaceっぽい