New submission from Arcadiy Ivanov <arca...@ivanov.biz>:

I'd like to start a discussion on/gauge interest for introducing an enhancement 
to PEP-498 in a form of delayed/lazy/lambda f-string.

The proposed change is, conceptually, minor and would not differ from PEP-498 
syntactically at all except for string prefix.

E.g. 

     extra = f'{extra},waiters:{len(self._waiters)}'

becomes

     extra = fl'{extra},waiters:{len(self._waiters)}'

The proposal would produce a lambda-like object x('format'), where x.__str__() 
== f'format'.

This should come extremely useful in all cases where delayed or conditional 
string formatting and concatenation are desired, such as in cases of logging.

As an example, currently, the 

    logger.debug("Format %s string", value) 

cannot be used with an f-string as follows 

    logger.debug(f"Format {value} string") 

without an unconditional evaluation of all parameters due to current 
compilation prior to logging checking whether it's even enabled for debug:

>>> b = 1
>>> def a(x):
...     return f"Foo {x} bar {b}"
... 
>>> dis.dis(a)
  2           0 LOAD_CONST               1 ('Foo ')
              2 LOAD_FAST                0 (x)
              4 FORMAT_VALUE             0
              6 LOAD_CONST               2 (' bar ')
              8 LOAD_GLOBAL              0 (b)
             10 FORMAT_VALUE             0
             12 BUILD_STRING             4
             14 RETURN_VALUE

Additional great optimizations may be rendered by introducing an a fl-string is 
a case where

    foo = "foo"
    s1 = fl"S1 value ${foo}"
    s2 = fl"S2 value of ${s1}"
    print(s2)

may produce only one BUILD_STRING instruction, potentially dramatically 
increasing performance in heavy string-concat based applications. 

Even when a compiler will not be able to statically prove that a particular 
value is in fact an fl-string, an interpreter-level check or a JIT-based Python 
implementation may be able to optimize such concats ad-nauseam (with trap-based 
deopt), allowing to collapse an extremely long chains of formats into a single 
BUILD_STRING op without any intermediary string allocation/concatenation (very 
useful in cases such as web servers, templating engines etc).

I'll be happy to produce patches against 3.7/3.8 for this if a general concept 
is found useful/desirable by the community.

----------
components: Library (Lib)
messages: 312909
nosy: arcivanov
priority: normal
severity: normal
status: open
title: Lazy Literal String Interpolation (PEP-498-based fl-strings)
type: enhancement
versions: Python 3.7, Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue32954>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to