如何在 运行 时间将字符串转换为格式化字符串文字?
How do I convert a string into a formatted string literal at run-time?
我正在努力完成 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
...但这不是我要找的。
编辑:评论中指出 "explicit" 选项是我 应该 寻找的。我同意我在这里提出的问题在很多方面都是不安全的。不过,我很想知道是否有办法做到这一点。
PEP 498 说
Because the compiler must be involved in evaluating the expressions contained in the interpolated strings, there must be some way to denote to the compiler which strings should be evaluated.
换句话说,f
对 字符串文字的解析方式 有影响,就像 r
一样。所以你必须调用解析器才能使插值工作。
您想将数据读入 some_string
并将其转换为可以解析为 f
字符串的字符串文字。这与想要将数据读入 some_lambda_expression
并将其转换为 lambda 表达式没有太大区别。当然,您可以使用 eval
来做到这一点,因为 eval
是一种通过调用解析器将字符串变量的内容转换为代码的方法。我知道那不是你想要的。但是你不能将 some_string
解析为 f
-string 而不 调用解析器,所以你不能得到你想要的东西。
我正在努力完成 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
...但这不是我要找的。
编辑:评论中指出 "explicit" 选项是我 应该 寻找的。我同意我在这里提出的问题在很多方面都是不安全的。不过,我很想知道是否有办法做到这一点。
PEP 498 说
Because the compiler must be involved in evaluating the expressions contained in the interpolated strings, there must be some way to denote to the compiler which strings should be evaluated.
换句话说,f
对 字符串文字的解析方式 有影响,就像 r
一样。所以你必须调用解析器才能使插值工作。
您想将数据读入 some_string
并将其转换为可以解析为 f
字符串的字符串文字。这与想要将数据读入 some_lambda_expression
并将其转换为 lambda 表达式没有太大区别。当然,您可以使用 eval
来做到这一点,因为 eval
是一种通过调用解析器将字符串变量的内容转换为代码的方法。我知道那不是你想要的。但是你不能将 some_string
解析为 f
-string 而不 调用解析器,所以你不能得到你想要的东西。