diff --git a/Lib/argparse.py b/Lib/argparse.py index 21299b69ecd74c..12d6360a5eac97 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1016,7 +1016,8 @@ def __init__(self, def __call__(self, parser, namespace, values, option_string=None): items = getattr(namespace, self.dest, None) - items = _copy_items(items) + if items is self.default: + items = _copy_items(items) items.append(values) setattr(namespace, self.dest, items) @@ -1045,7 +1046,8 @@ def __init__(self, def __call__(self, parser, namespace, values, option_string=None): items = getattr(namespace, self.dest, None) - items = _copy_items(items) + if items is self.default: + items = _copy_items(items) items.append(self.const) setattr(namespace, self.dest, items) @@ -1238,7 +1240,8 @@ def __call__(self, parser, namespace, values, option_string=None): class _ExtendAction(_AppendAction): def __call__(self, parser, namespace, values, option_string=None): items = getattr(namespace, self.dest, None) - items = _copy_items(items) + if items is self.default: + items = _copy_items(items) items.extend(values) setattr(namespace, self.dest, items) diff --git a/Misc/NEWS.d/next/Library/2024-10-02-21-34-08.gh-issue-96859.efyaxu.rst b/Misc/NEWS.d/next/Library/2024-10-02-21-34-08.gh-issue-96859.efyaxu.rst new file mode 100644 index 00000000000000..fde73072045c39 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-10-02-21-34-08.gh-issue-96859.efyaxu.rst @@ -0,0 +1,4 @@ +Optimize :mod:`argparse` actions 'append', 'append_const' and 'extend' for +the case when the option is specified many times. +The target list is no longer copied every time the action is taken, only +the default value is copied the first time the action is taken.