【发布时间】:2018-04-16 08:34:00
【问题描述】:
我正在通过PEP 498 工作。也许我不太明白这个概念,但我怎么可能将常规 Python 字符串转换为格式化的字符串文字并在运行时对其进行评估?
假设你有一个字符串:
some_string = 'Name: {name}'
如果它是格式化的字符串文字,则以下内容将起作用:
name = 'Demo'
some_string_literal = f'Name: {name}'
some_string_literal == 'Name: Demo' # returns True
忽略这是否有意义的问题,我怎么能例如?在运行时从文件中读取some_string 的内容,将其转换为some_string_literal 并评估它?我对底层 CPython 实现的理解是字符串文字在编译时被解释(翻译成字节码)。
我知道更多 "explicit" option 只是使用 ...
some_string = 'Name: {name}'
some_string.format(name = 'Demo') == 'Name: Demo' # returns True
...但这不是我要找的。p>
编辑:在 cmets 中指出,“显式”选项是我应该寻找的。我同意我在这里提出的问题在很多方面肯定是不安全的。不过,我对是否有办法做到这一点很感兴趣。
【问题讨论】:
-
“显式选项”应该是您正在寻找的。基本上你在问你的字符串如何“吸收”范围内的任何随机变量。这不是一个理智的想法。允许(潜在的)用户输入访问当前范围内的任何内容都可能导致从数据泄漏到漏洞利用的任何事情。本质上它变成了
eval的一种形式。您应该将允许的值显式注入format,仅此而已。 -
您应该使用显式选项。否则,它需要一些非常丑陋的东西,比如
eval(f'"{some_string_literal}"') -
@deceze 是的,我认为从安全角度来看这是一个坏主意。这很像在不受信任的代码上运行
eval。
标签: python python-3.x f-string