アクションを実装する組み込みのargparse._AppendActionのソースコードを見ていましたが、その実装方法に"append"戸惑いました。
def __call__(self, parser, namespace, values, option_string=None):
items = _copy.copy(_ensure_value(namespace, self.dest, []))
items.append(values)
setattr(namespace, self.dest, items)
それを分解するには:
_ensure_value属性のようなdict.setdefaultものです。つまりnamespace、名前の属性がある場合はself.destそれが返され、そうでない場合は設定され[]て返されます。_copy.copy(x)浅いコピーだけを返します。がリストの場合x、それはまったく同じですlist(x)(ただし低速です)。- 次に、アイテムはから取得したリストのコピー
namespaceに追加されます。 - 最後に、の
self.dest属性がnamespaceコピーで上書きされます。これにより、古いリストがガベージコレクションされます。
なぜこのような回りくどい非効率的な方法で、各追加のリスト全体を破棄するのでしょうか。なぜこれで十分ではないのですか?
def __call__(self, parser, namespace, values, option_string=None):
items = _ensure_value(namespace, self.dest, [])
items.append(values)