アクションを実装する組み込みの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)