Skip to content

Commit 47e6c18

Browse files
pythongh-124745: Optimize argparse actions 'append', 'append_const' and 'extend'
Previously, the target list was copied every time the action was taken. Now only the default value is copied the first time the action is taken.
1 parent 04b2a8f commit 47e6c18

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

Lib/argparse.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,8 @@ def __init__(self,
10161016

10171017
def __call__(self, parser, namespace, values, option_string=None):
10181018
items = getattr(namespace, self.dest, None)
1019-
items = _copy_items(items)
1019+
if items is self.default:
1020+
items = _copy_items(items)
10201021
items.append(values)
10211022
setattr(namespace, self.dest, items)
10221023

@@ -1045,7 +1046,8 @@ def __init__(self,
10451046

10461047
def __call__(self, parser, namespace, values, option_string=None):
10471048
items = getattr(namespace, self.dest, None)
1048-
items = _copy_items(items)
1049+
if items is self.default:
1050+
items = _copy_items(items)
10491051
items.append(self.const)
10501052
setattr(namespace, self.dest, items)
10511053

@@ -1238,7 +1240,8 @@ def __call__(self, parser, namespace, values, option_string=None):
12381240
class _ExtendAction(_AppendAction):
12391241
def __call__(self, parser, namespace, values, option_string=None):
12401242
items = getattr(namespace, self.dest, None)
1241-
items = _copy_items(items)
1243+
if items is self.default:
1244+
items = _copy_items(items)
12421245
items.extend(values)
12431246
setattr(namespace, self.dest, items)
12441247

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Optimize :mod:`argparse` actions 'append', 'append_const' and 'extend' for
2+
the case when the option is specified many times.
3+
The targed list no longer copied every time the action is taken, only
4+
the default value is copied the first time the action is taken.

0 commit comments

Comments
 (0)