[issue16399] argparse: append action with default list adds to list instead of overriding

paul j3 added the comment: One thing that this default behavior does is allow us to append values to any object, just so long as it has the `append` method. The default does not have to be a standard list. For example, in another bug/issue someone asked for an `extend` action. I could provide that with `append` and a custom list class class MyList(list): def append(self,arg): if isinstance(arg,list): self.extend(arg) else: super(MyList, self).append(arg) This just modifies `append` so that it behaves like `extend` when given a list argument. parser = argparse.ArgumentParser() a = parser.add_argument('-f', action='append', nargs='*',default=[]) args = parser.parse_args('-f 1 2 3 -f 4 5'.split()) produces a nested list: In [155]: args Out[155]: Namespace(f=[['1', '2', '3'], ['4', '5']]) but if I change the `default`: a.default = MyList([]) args = parser.parse_args('-f 1 2 3 -f 4 5'.split()) produces a flat list: In [159]: args Out[159]: Namespace(f=['1', '2', '3', '4', '5']) I've tested this idea with an `array.array` and `set` subclass. ---------- _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue16399> _______________________________________
participants (1)
-
paul j3