python教程—我可以推迟f-string的计算吗?-Python实用宝典

python教程—我可以推迟f-string的计算吗?

我正在使用模板字符串生成一些文件,我喜欢简洁的新f字符串的目的,从这样的东西减少我以前的模板代码:

我正在使用模板字符串生成一些文件,我喜欢简洁的新f字符串的目的,从这样的东西减少我以前的模板代码:

    template_a = "The current name is {name}" names = ["foo", "bar"] for name in names: print (template_a.format(**locals()))

现在我可以直接替换变量:

    names = ["foo", "bar"] for name in names: print (f"The current name is {name}")

,但是,有时候在其他地方定义模板是有意义的——在代码的上层,或者从文件或其他地方导入。这意味着模板是一个静态字符串,其中包含格式化标记。必须对字符串进行一些处理,才能告诉解释器将字符串解释为一个新的f-string,但是我不知道是否存在这样的东西。

有没有办法引入一个字符串,并将其解释为f-string,以避免使用.format(**local())调用?

理想情况下,我希望能够像这样编写代码……(magic_fstring_function是我不理解的地方):

    template_a = f"The current name is {name}" # OR [Ideal2] template_a = magic_fstring_function(open('template.txt').read()) names = ["foo", "bar"] for name in names: print (template_a)

…有了这个期望的输出(不需要读取文件两次):

    The current name is foo The current name is bar

…但我得到的实际输出是:

    The current name is {name} The current name is {name}

回答

这里有一个完整的“理想2”。

它不是f-string它甚至不用f-string。但它按要求做了。语法完全符合指定。没有安全头部疼痛,因为我们没有使用eval。

它使用一个小类并实现了由print自动调用的_str__。为了跳出类的有限范围,我们使用inspect模块跳出一个框架,查看调用者可以访问的变量。

    import inspect class magic_fstring_function: def __init__(self, payload): self.payload = payload def __str__(self): vars = inspect.currentframe().f_back.f_globals.copy() vars.update(inspect.currentframe().f_back.f_locals) return self.payload.format(**vars) template = "The current name is {name}" template_a = magic_fstring_function(template) # use it inside a function to demonstrate it gets the scoping right def new_scope(): names = ["foo", "bar"] for name in names: print(template_a) new_scope() # The current name is foo # The current name is bar

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论