当前位置: 首页 > 面试题库 >

如何推迟/推迟对f弦的评估?

楚嘉纳
2023-03-14
问题内容

我正在使用模板字符串生成一些文件,为此我喜欢新的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字符串,但是我不知道是否存在这种情况。

有什么方法可以引入字符串并将其解释为f字符串,从而避免使用.format(**locals())调用?

理想情况下,我希望能够像这样进行编码…(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字符串,它甚至不使用f字符串,但可以按要求进行操作。语法完全符合规定。没有使用安全性,因为我们没有使用eval()

它使用了一个小类并实现了__str__由print自动调用的类。为了逃避该类的有限范围,我们使用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


 类似资料:
  • 在spring-AMQP中,有可能以某种方式推迟监听来自某个特定队列的消息吗? 在我的用例中,我有一个服务,它必须侦听两个RabbitMQ队列上的消息。第一个专用于此服务,第二个用于my service的多个实例(运行在不同的机器上)的负载平衡作业。 我的statup服务通过第一个队列接收配置并自我配置。只有在配置之后,才允许处理第二个队列中的“标准”作业--而不是在配置之前。 我怎样才能做到这一

  • 问题内容: 假设我有以下功能 如规范中所述: 每次执行“ defer”语句时,将照常评估调用的函数值和参数并重新保存,但不会调用实际函数。 显然,函数执行结束时将输出零。但是,如果我想打印出变量的最终值该怎么办? 我提出了以下解决方案: 所以我想知道是否有更好的方法来解决此问题。 问题答案: 如果defer有参数,则在defer语句的行对其进行评估;以下代码段对此进行了说明,其中defer将显示0

  • 问题内容: 是否有人使用过nodejs模块“ deferred”和“ mongoose”?我试图让deferred.promisify方法可以在猫鼬模型的函数上工作,以便我可以轻松地将它们链接起来,但是会遇到一些麻烦。具体来说,我想对和函数进行赋值处理,以便可以通过ObjectID链接查找另一个文档引用的一个文档。 这就是我所拥有的:https : //gist.github.com/332182

  • 问题内容: 我已经配置了一些基本路由,可供所有用户登录后使用: 因此,用户唯一可以做的就是登录。用户登录后,我想注册其他路由,如下所示: 但是,我想我应该只调用一次.config方法,因为$ routeProvider是全新的实例,对/ login路由一无所知。进一步的调试显示,在解决视图更改时会使用$ resourceProvider的第一个实例。 问:有没有办法以后注册路线? 从动态添加路由和

  • 问题内容: 使用jQuery延迟,我习惯于这样检查当前状态: 有没有办法对Angular deferreds做同样的事情?(甚至更好的承诺) 问题答案: 更新 : 由于$ q的重构,现在可以实现,尽管没有记录: 原件 : 与大多数承诺库(Bluebird,Q,when,RSVP等)不同,$ q不公开同步检查API。 无法从外部实现此目的。 您必须调用promise,并且当promise实现时,该处

  • 问题内容: 我将Q节点库用于Promises,我认为这个问题也适用于Bluebird库。 语境 我需要对自己的自定义函数和node.js 样式异步函数进行一些函数调用。 如果我正在调用这样的函数: 同步功能 并需要以上内容来执行此功能: 同步功能 并且需要调用类似于以下内容的本机节点函数: 异步功能 并需要以上内容来执行此功能: 同步功能 题 为了使我的所有函数“递延”或答应知道,在这里要做的“正

  • 问题内容: 我正在尝试根据Google文档为开发人员 优化CSS交付 在内联一个小的CSS文件的示例中可以看到,关键的CSS内联在头部, 原始的small.css在页面加载后加载 。 我对这个例子的疑问: 页面加载后如何加载大型CSS文件? 问题答案: 如果您不介意使用jQuery,这里有一个简单的代码段可以帮助您。(否则,我将写一个纯js示例 只需在您的或函数中调用它,就可以了。 对于#2,为什

  • 我正在寻找一种方法,可以在我选择的时候将战争工件部署到IntelliJ启动的Tomcat中。我有一个项目,它的配置启动了Tomcat8服务器并部署了一些工件。LaterI现在希望将更多来自不同项目的工件部署到同一个IntelliJ启动的Tomcat中。 步骤:启动包含Tomcat的项目 步骤:从另一个IntelliJ-project(从IDE内)部署war 步骤:从IntelliJ部署另一个war