Whoa! Whoa! Whoa!
I appreciate the points you are making, Chris, but I am a bit taken aback by such forceful language.

On 27/01/2023 19:18, Chris Angelico wrote:
On Sat, 28 Jan 2023 at 05:31, Rob Cliffe via Python-list
<python-list@python.org> wrote:
On 23/01/2023 18:02, Chris Angelico wrote:
Maybe, rather than asking for a way to treat a string as code, ask for
what you ACTUALLY need, and we can help?

ChrisA
Fair enough, Chris, but still ISTM that it is reasonable to ask (perhaps
for a different use-case) whether there is a way of evaluating a string
at runtime as if it were an f-string.  We encourage people to ask
questions on this list, even though the answer will not always be what
they're hoping for.
No, it's not, because that's the "how do I use X to do Y" problem.
Instead, just ask how to do *what you actually need*. If the best way
to do that is to eval an f-string, then someone will suggest that.
But, much much much more likely, the best way to do it would be
something completely different. What, exactly? That's hard to say,
because *we don't know what you actually need*. All you tell us is
what you're attempting to do, which there is *no good way to achieve*.
If the above is addressed to the OP, I can't answer for him.
If it's addressed to me:  How about if I wanted a program (a learning tool) to allow the user to play with f-strings? I.e. to type in a string, and then see what the result would be if it had been an f-string? I suspect there are other use cases, but I confess I can't think of one right now.

I appreciate that the answer may be "No, because it would be a lot of
work - and increase the maintenance burden - to support a relatively
rare requirement".
What about: "No, because it's a terrible TERRIBLE idea, requires that
you do things horribly backwards, and we still don't even know what
you're trying to do"?

Perhaps someone will be inspired to write a function to do it. 😎
See, we don't know what "it" is, so it's hard to write a function
that's any better than the ones we've seen.
Again, if this is addressed to the OP: I'm not his keeper. 😁
If it's addressed to me: "it" means a function that will take a string and evaluate it at runtime as if it were an f-string.  Sure, with caveats and limitations.  And indeed Thomas Passim found this partial solution on Stack Overflow:
def effify(non_f_str: str):
    return eval(f'f"""{non_f_str}"""')
  Using eval() to construct
an f-string and then parse it is TERRIBLE because:

1) It still doesn't work in general, and thus has caveats like "you
can't use this type of quote character"
2) You would have to pass it a dictionary of variables, which also
can't be done with full generality
3) These are the exact same problems, but backwards, that led to
f-strings in the first place
4) eval is extremely slow and horrifically inefficient.
I understand these limitations.  Nonetheless I can conceive that there may be scenarios where it is an acceptable solution (perhaps the learning tool program I suggested above).
Addressing your points specifically:
    1) I believe the quote character limitation could be overcome. It would need a fair amount of work, for which I haven't (yet) the time or inclination.     2) Yes in general you would have to pass it one dictionary, maybe two.  I don't see this as an insuperable obstacle.  I am not sure what you mean by "can't be done with full generality" and perhaps that's not important.
    3) Not sure I understand this.
    4) On the fairly rare occasions that I have used eval(), I can't remember speed ever being a consideration.

For some reason, str.format() isn't suitable, but *you haven't said
why*, so we have to avoid that in our solutions. So, to come back to
your concern:

We encourage people to ask
questions on this list, even though the answer will not always be what
they're hoping for.
Well, yes. If you asked "how can I do X", hoping the answer would be
"with a runtime-evaluated f-string", then you're quite right - the
answer might not be what you were hoping for. But since you asked "how
can I evaluate a variable as if it were an f-string", the only
possible answer is "you can't, and that's a horrible idea".
I hope that I have shown that this is a somewhat dogmatic response.

Don't ask how to use X to do Y. Ask how to do Y.
Good advice.
Best wishes
Rob Cliffe

ChrisA

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to