[Python-ideas] Delayed Execution via Keyword

Pavol Lisy pavol.lisy at gmail.com
Fri Feb 17 10:02:28 EST 2017


On 2/17/17, Chris Angelico <rosuav at gmail.com> wrote:

> Do delayed-expressions have identities or only values? For example:
>
> rand = delayed: random.randrange(10)
> otherrand = rand
> assert rand is otherrand # legal?
> randid = id(rand) # legal?
> print(rand) # force to concrete value
> assert any(rand is x for x in range(10)) # CPython int caching
> assert randid == id(rand) # now what?
>
> Alternatively, once the value becomes concrete, the delayed-expression
> becomes a trampoline/proxy to the actual value. Its identity remains
> unchanged, but all attribute lookups would be passed on to the other
> object. That does mean a permanent performance penalty though -
> particularly if it's doing it all in Python code rather than some sort
> of quick C bouncer.

what about:

    lazy_string = delayed: f"{fnc()}"

could it be possible?

BTW I was also thinking about something like l-strings (aka lazy
f-string) to solve this problem:

    logger.debug("format {expensive()}")

Still not sure if it is a good idea but with something like this:

    class Lazy_String:
        ''' this is only quick and dirty test implementation! '''

        def __init__(self, string=None):
            if string is None:
                self.body = "'None'"
            else:
                self.body = compile('f'+repr(string), "<lazy_string>", 'eval')
        def __sub__(self, string):
            self.__init__(string)
            return self
        def __str__(self):
            return eval(self.body)
        def __repr__(self):
            return self.__str__()

    lazy = Lazy_String()

we could use this:

    from lazy_string import lazy as l

    logger.debug(l-"format {expensive()}")  # kind of l-string without
new syntax


More information about the Python-ideas mailing list