使用字符串模板在 python 中制作 quine?

Using string templates for making a quine in python?

我基本上是想在 python 中制作一个 quine 并首先尝试使用 f 字符串,但我很快意识到我首先必须定义我想要在字符串中设置格式的变量。然后我了解了字符串模板并认为这将是可行的方法。然而,我没有那么有经验,可能需要一些帮助。有什么建议吗?

这是实际代码:

from string import Template
s="from string import Template\ns=$s\nt=Template($s).substitute(s=$s)\nprint($s)"
t=Template(s).substitute(s=s)
print(s)

它给了我一些正确的结果。唯一的问题是它没有用实际字符串替换 $s 。我可能只是误解了 quines 的整个概念以及执行它们的方法,但我觉得这应该有效。

输出:

from string import Template
s=$s
t=Template($s).substitute(s=$s)
print($s)

我不确定如何使用 string.Template 完成此操作,但您可以使用 str.format 作为适合此任务的 f 弦的直接替代品,因为它允许您延迟s 变量的插值:

s='s={0!r}\nprint(s.format(s))'
print(s.format(s))

输出:

s='s={0!r}\nprint(s.format(s))'
print(s.format(s))

!r用于获取srepr,用引号括起来,并转义换行符。

我听取了@Will Da Silva 的建议,并在我的方法中加入了 repr() 函数,如下所示:

from string import Template
s='from string import Template\ns=$s\nt=Template(s)\nprint(t.substitute(s=repr(s)))'
t=Template(s)
print(t.substitute(s=repr(s)))

我认为问题在于它将字符串解释为代码,然后在每个 \n 处换行。但是现在,当它保留引号时,它只会将其视为一个字符串。