On Tue, Sep 1, 2020, at 21:06, Ricky Teachey wrote:
> Here's my attempt, it is probably lacking. I'm five years into a
> self-taught venture in python... If I can't get this right the first
> time, it worries me a little.
>
>
> MISSING=object()
>
> def __getitem__(self, key=MISSING, time=MISSING, money=MISSING):
> if time is MISSING or money is MISSING:
> if time is not MISSING and key is not MISSING:
> money = key
> elif money is not MISSING and key is not MISSING:
> time = key
> else:
> time, money = key
>
> Is this right? Wrong? The hard way? The slow way?
>
> What about when there are three arguments? What then?
I'm using () rather than a MISSING as the sentinel here because it makes the
code simpler. For the same reason, if we need to choose a key to pass in by
default for a[**kwargs only] without defining a () in __getitem__, I have
consistently advocated using () for this. Likewise, *not* having a default [or
requiring the method to define its own default] key presents a slight problem
for __setitem__, illustrated below.
def __getitem__(self, key=(), /, **kwargs):
return self._getitem(*(key if isinstance(key, tuple) else (key,)), **kwargs)
def __setitem__(self, key=(), value=???, /, **kwargs):
return self._setitem(value, *(key if isinstance(key, tuple) else (key,)),
**kwargs)
def _getitem(self, time, money):
...
def _setitem(self, value, time, money):
...
[delitem the same as getitem]
Basically, you can easily write code that leverages the existing function
argument parsing, simply by performing a function call.
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/EWJAKIBXQQJNMWT7EXZHAKOUP35YOREV/
Code of Conduct: http://python.org/psf/codeofconduct/