在Python中使用字符串模板制作Quine?

4

我基本上是在尝试在Python中制作一个quine,最开始尝试了f-strings,但很快发现我必须先定义要格式化的变量。然后我学习了字符串模板,并想到使用这种方法。然而,我对此并不是很有经验,需要一些帮助。有什么建议吗?

以下是实际代码:

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)
2个回答

4

我不确定如何使用string.Template来实现此操作,但您可以使用str.format作为直接替换f-strings的简单方法,它允许您延迟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,它会将其包裹在引号中,并转义换行符。


关键在于使用 !r 修改器/指令,它使用 repr 而不是 str。这是您可以恢复引号的方法,因为字符串的默认 repr 实现是以引用形式返回字符串,就像您在 Python 源代码中键入的那样。我不确定是否有一种方法可以使用 string.Template 来实现这一点。 - shadowtalker
{0!r} 中的 0 是什么意思? - Goby
提供给 str.format 的元素的索引,即我们传递给 str.format 的第一个元素,即 s - Will Da Silva

0
我采纳了@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处换行。但现在当它保留引号时,它只将其视为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接