argparseテストコード中のNSオブジェクト
code:肝となる部分.py
class NS:
def __init__(self, **kwargs) -> None:
self.__dict__.update(**kwargs)
def __eq__(self, other: object) -> bool:
return vars(self) == vars(other)
イニシャライザ
任意のクラス属性を追加できるイニシャライザ
code:python
>> ns = NS(foo=42, bar="spam")
>> ns.__dict__
{'foo': 42, 'bar': 'spam'}
>> ns.foo
42
__eq__
自身と他のインスタンスの__dict__を比較
code:python
>> vars(ns)
{'foo': 42, 'bar': 'spam'}
>> vars(ns) == ns.__dict__
True
code:python
parser = argparse.ArgumentParser()
parser.add_argument("string")
parser.add_argument("number", type=int)
args = parser.parse_args("spam 42".split())
>> type(args)
<class 'argparse.Namespace'>
>> args.__dict__
{'string': 'spam', 'number': 42}
>> args == NS(number=42, string="spam")
True
Namespaceオブジェクトに__eq__はあるが、NSとの比較はNotImplemented
そこでNS側の__eq__が使われる
また、(ここでは省略したが)NSに__repr__があるので、assertionの失敗が読みやすく表示される(のだと思う)
NSはtypes.SimpleNamespaceで置き換えられるのかも