使用Python的string Template实现quine时$s无法替换该如何解决?
问题排查与解决方案
核心错误点
- 输出变量错误:你代码最后执行的是
print(s),打印的是未做替换的原始模板字符串,自然所有$s占位符都没有被替换。你已经通过substitute方法生成了替换后的结果t,但并没有打印这个变量。 - 模板设计不符合quine要求:quine需要程序输出和自身源代码完全一致,你当前的模板中直接写
s=$s,替换时不会自动给字符串值加外层引号,也不会转义换行等特殊字符,就算打印t也得不到和原代码一致的结果。
修正后的可运行实现
from string import Template s = 'from string import Template\ns = ${s}\nt = Template(s).substitute(s=repr(s))\nprint(t)' t = Template(s).substitute(s=repr(s)) print(t)
修正说明
- 替换参数传入
repr(s):repr()会自动给字符串加上外层引号,同时转义内部的换行符等特殊字符,保证替换后s的赋值语句和原代码完全一致 - 模板中使用
${s}明确占位符边界,避免和后续字符产生歧义 - 最后打印替换完成的变量
t而非原始模板s
运行上述代码输出的内容和源代码完全一致,符合quine的定义。
内容的提问来源于stack exchange,提问作者Goby
相关产品推荐
相关产品推荐

