On Thu, 24 Jun 2021 at 17:25, Eric Nieuwland <[email protected]> wrote:
>
> class DelayedFString(str):
>     def __str__(self):
>         vars = inspect.currentframe().f_back.f_globals.copy()
>         vars.update(inspect.currentframe().f_back.f_locals)
>         return self.format(**vars)

This isn't quite right as the semantics between f-strings and
str.format() are not actually the same (though this isn't well
documented):

    >>> f'{1 + 2}'
    '3'
    >>> str(DelayedFString('{1 + 2}'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in __str__
    KeyError: '1 + 2'

    >>> d = dict(a=1)
    >>> f'{d["a"]}'
    '1'
    >>> str(DelayedFString('{d["a"]}'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in __str__
    KeyError: '"a"'

Basically, f-strings rely on eval-like semantics.

Martin
_______________________________________________
Python-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/[email protected]/message/HGITYZPPRXJM4Y7YVJKUSVXUB75W5Z2L/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to