| ▲ | ossopite 9 days ago |
| I'm not sure if t-strings help here? unless I misread the PEP, it seems like they still eagerly evaluate the interpolations. There is an observation that you can use `lambda` inside to delay evaluation of an interpolation, but I think this lambda captures any variables it uses from the context. |
|
| ▲ | actinium226 9 days ago | parent | next [-] |
| > There is an observation that you can use `lambda` inside to delay evaluation of an interpolation, but I think this lambda captures any variables it uses from the context. Actually lambda works fine here >>> name = 'Sue'
>>> template = lambda name: f'Hello {name}'
>>> template('Bob')
'Hello Bob'
|
|
| ▲ | davepeck 9 days ago | parent | prev | next [-] |
| > I'm not sure if t-strings help here? That's correct, they don't. Evaluation of t-string expressions is immediate, just like with f-strings. Since we have the full generality of Python at our disposal, a typical solution is to simply wrap your t-string in a function or a lambda. (An early version of the PEP had tools for deferred evaluation but these were dropped for being too complex, particularly for a first cut.) |
| |
| ▲ | krick 9 days ago | parent [-] | | And that actually makes "Template Strings" a misnomer in my mind. I mean, deferred (and repeated) evaluation of a template is the thing that makes template a template. Kinda messy PEP, IMO, I'm less excited by it than I'd like to be. The goal is clear, but the whole design feels backwards. | | |
| ▲ | davepeck 9 days ago | parent [-] | | Naming is hard; for instance, JavaScript also has its own template strings, which are also eagerly evaluated. |
|
|
|
| ▲ | notpushkin 9 days ago | parent | prev | next [-] |
| > An early version of this PEP proposed that interpolations should be lazily evaluated. [...] This was rejected for several reasons [...] Bummer. This could have been so useful: statement_endpoint: Final = "/api/v2/accounts/{iban}/statement"
(Though str.format isn’t really that bad here either.) |
| |
| ▲ | nhumrich 9 days ago | parent | next [-] | | There was a very very long discussion on this point alone, and there are a lot of weird edge cases, and led to weird syntax things. The high level idea was to defer lazy eval to a later PEP if its still needed enough. There are a lot of existing workarounds in the discussions if you are interested enough in using it, such as using lambdas and t-strings together. | |
| ▲ | LordShredda 9 days ago | parent | prev | next [-] | | Would be useful in that exact case, but would be an absolute nightmare to debug, on par with using global variables as function inputs | | |
| ▲ | notpushkin 9 days ago | parent [-] | | Yeah, to be honest, every time this comes to mind I think “wow, this would be really neat!”, then realize just using .format() explicitly is way easier to read. |
| |
| ▲ | o11c 9 days ago | parent | prev [-] | | I do think that people are far too hesitant to bind member functions sometimes: statement_endpoint: Final = "/api/v2/accounts/{iban}/statement".format
(it's likely that typecheckers suck at this like they suck at everything else though) |
|
|
| ▲ | tylerhou 9 days ago | parent | prev | next [-] |
| You could do something like t”Hello, {“name”}” (or wrap “name” in a class to make it slightly less hacky). |
|
| ▲ | skeledrew 9 days ago | parent | prev [-] |
| Lambda only captures variables which haven't been passed in as argument. |