Arcadiy Ivanov <arca...@ivanov.biz> added the comment:

As an example this is the current state of affairs:

>>> def x():
...     foo = "foo"
...     s1 = f"S1 value {foo}"
...     s2 = f"S2 value {s1}"
...     print(s2)
... 
>>> dis.dis(x)
  2           0 LOAD_CONST               1 ('foo')
              2 STORE_FAST               0 (foo)

  3           4 LOAD_CONST               2 ('S1 value ')
              6 LOAD_FAST                0 (foo)
              8 FORMAT_VALUE             0
             10 BUILD_STRING             2
             12 STORE_FAST               1 (s1)

  4          14 LOAD_CONST               3 ('S2 value ')
             16 LOAD_FAST                1 (s1)
             18 FORMAT_VALUE             0
             20 BUILD_STRING             2
             22 STORE_FAST               2 (s2)

  5          24 LOAD_GLOBAL              0 (print)
             26 LOAD_FAST                2 (s2)
             28 CALL_FUNCTION            1
             30 POP_TOP
             32 LOAD_CONST               0 (None)
             34 RETURN_VALUE

whereas an fl-string representation of:

>>> def x():
...     foo = "foo"
...     s1 = fl"S1 value {foo}"
...     s2 = fl"S2 value {s1}"
...     print(s2)
... 

would behave close to:

>>> def x():
...     foo = "foo"
...     s1 = lambda: f"S1 value {foo}"
...     s2 = lambda: f"S2 value {s1()}"
...     print(s2())
... 
>>> dis.dis(x)
  2           0 LOAD_CONST               1 ('foo')
              2 STORE_DEREF              0 (foo)

  3           4 LOAD_CLOSURE             0 (foo)
              6 BUILD_TUPLE              1
              8 LOAD_CONST               2 (<code object <lambda> at 
0x7ff2ef1abd20, file "<stdin>", line 3>)
             10 LOAD_CONST               3 ('x.<locals>.<lambda>')
             12 MAKE_FUNCTION            8
             14 STORE_DEREF              1 (s1)

  4          16 LOAD_CLOSURE             1 (s1)
             18 BUILD_TUPLE              1
             20 LOAD_CONST               4 (<code object <lambda> at 
0x7ff2ef1abae0, file "<stdin>", line 4>)
             22 LOAD_CONST               3 ('x.<locals>.<lambda>')
             24 MAKE_FUNCTION            8
             26 STORE_FAST               0 (s2)

  5          28 LOAD_GLOBAL              0 (print)
             30 LOAD_FAST                0 (s2)
             32 CALL_FUNCTION            0
             34 CALL_FUNCTION            1
             36 POP_TOP
             38 LOAD_CONST               0 (None)
             40 RETURN_VALUE

Where LOAD_CONST, LOAD_CONST, MAKE_FUNCTION sequences are replaced with 
BUILD_LAZY_STRING (name's provisional) producing the same lambda-like formatter 
function that cooperates with FORMAT_VALUE and BUILD_STRING/BUILD_LAZY_STRING 
ops.

----------
components: +Interpreter Core -Library (Lib)
nosy:  -serhiy.storchaka

_______________________________________
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