
On 4/12/2014 3:28 PM, Joseph Martinot-Lagarde wrote:
I propose to allow to define keyword-only arguments for __getitem__.
The main use case is to be able to set a default value for indexing. I though about it after reading PEP 463 (Exception-catching expressions), this would be an alternative for one of the problem this PEP is trying to solve. Compare these solutions:
lst = [1, 2, 3] value = lst[3] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range try: # Python .... value = lst[3] .... except IndexError: .... value = 0 value = lst[3] except IndexError: 0 # PEP 463 value = lst[3, default=0] # My proposal
The problem with this is, as you note below, that everything between [ and ] is turned into a single object passed on to __getitem__. That includes slice notation I:J:I, which is currently only valid in this context. Syntactically, collection indexing is quite different from function calling. (Python could have been defined so that they were the same.) I think it would be better if the key were syntactically separated from a default, say with ;. value = lst[3; 0] I believe any proposal along this line would make dict.getitem obsolete, and eliminate any call for list.getitem.
Default value is not the only use case. One could for example define a subclass of list computing an interpolation if a float is given as a parameter instead of truncating it, and the keword argument would define which kind of interpolation (nearest, linear, spline...).
I think interp should be a method of the subclass.
Or it could define if the value returned are in degrees or radians. (Yes, I have a scientific background.)
.setunit('degrees') with radians the default.
I use something similar for a dictionary-like interface where the keys are strings and only numbers are stored. The second argument, if given, is the default:
data["key", 0] It would be clearer to use: data["key", default=0]
I see data['key'; 0] as an in between compromise. The 0 is separated from the key but without the heavy 'default='.
(Of course I could use a get method for this purpose, but bracket for indexing seems always more clear).
-- Terry Jan Reedy