[Python-ideas] Another use case for the 'lazy' (aka 'delayed') keyword

Joseph Hackman josephhackman at gmail.com
Tue Feb 28 10:29:37 EST 2017


I like null coalesce too. :)

I know that BDFL has said no to ? Before, but was that for the if-then shorthand only? 

Perhaps submit a new thread to this list so people can discuss/find?

-Joseph

> On Feb 28, 2017, at 10:21 AM, Mark E. Haase <mehaase at gmail.com> wrote:
> 
> This could be solved with a null-coalescing operator, e.g. PEP-505.
> 
>    >>> val = conf.get('setting_name') ?? load_from_db('setting_name')
> 
> The right side isn't evaluated unless the left side is None. It's similar to this:
> 
>    >>> val = conf.get('setting_name') or load_from_db('setting_name')
> 
> Except that using "or" would result in any false-y value (0, "", [], etc.) being overridden by the result of `load_from_db(...)`.
> 
> I'm not strongly opposed to "lazy", but I think null-coalescing is easier to reason about.
> 
> 
>> On Tue, Feb 28, 2017 at 7:04 AM, Michel Desmoulin <desmoulinmichel at gmail.com> wrote:
>> The debate on the 'lazy' keyword seems to have settled, but I don't know
>> if somebody is trying to write a PEP about it.
>> 
>> Anyway, I was doing something like this the other day:
>> 
>> conf.get('setting_name', load_from_db('setting_name'))
>> 
>> And then realized I could save a query not doing the load_from_db() call
>> most of the time.
>> 
>> But dict.get didn't accept callable so I couldn't do:
>> 
>> conf.get('setting_name', lambda key: load_from_db('setting_name'))
>> 
>> Which is standard practice in a lot of popular Python libs on Pypi.
>> 
>> Instead I did:
>> 
>> val = conf.get('setting_name')
>> if val is None:
>>     val = load_from_db('setting_name')
>> 
>> Which is way more verbose. It also has a bug if None is a valid
>> configuration value or if I expect my code to be thread safe.
>> 
>> It was not a problem for me, but in that case one would even have to do:
>> 
>> try:
>>     val = conf['setting_name']
>> except KeyError:
>>     val = load_from_db('setting_name')
>> 
>> Which is even more verbose.
>> 
>> I was going to suggest to python-ideas to update the dict.get()
>> signature to accept a callable, but it would break compatibility with
>> many code actually getting a callable.
>> 
>> We could do it for Python 4, but it's far way.
>> 
>> Instead, I think it's a good example of were 'lazy' could help. You
>> can't get simpler than:
>> 
>> conf.get('setting_name', lazy load_from_db('setting_name'))
>> 
>> 
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas at python.org
>> https://mail.python.org/mailman/listinfo/python-ideas
>> Code of Conduct: http://python.org/psf/codeofconduct/
> 
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170228/a1ad1082/attachment.html>


More information about the Python-ideas mailing list