【问题标题】:Is that quine or what?是奎宁还是什么?
【发布时间】:2019-09-24 15:07:15
【问题描述】:

我编写了简单的装饰器,它打印传递给它的函数(例如“foo”),然后我自己装饰它。所以最后它打印了两个书面函数。

我最近阅读了有关 quines 的内容,但有点坚持它的精确定义。例如,根据this source 的说法,一个quine“必须精确地打印出程序员作为程序一部分编写的那些指令”。

所以我的问题是:我可以将书面程序视为 quine 吗?

def decorate(function):
    from inspect import getsourcelines

    def wrapper(*args, **kwargs):
        for line_num, code_line in enumerate(getsourcelines(function)[0]):
            print(code_line)
    return wrapper


@decorate
def foo(bar1, bar2=777):
    print("bar")


foo(None)

decorate(decorate)(decorate)

精确的输出是:

@decorate
def foo(bar1, bar2=777):
    print("bar")

def decorate(function):
    from inspect import getsourcelines

    def wrapper(*args, **kwargs):
        for line_num, code_line in enumerate(getsourcelines(function)[0]):
            code_line = code_line.replace('\n', '')
            print(code_line)
    return wrapper

【问题讨论】:

    标签: python python-3.x decorator definition quine


    【解决方案1】:

    quine 是一种计算机程序,它不接受任何输入并生成自己的源代码副本作为其唯一输出1

    最后一个编辑维基百科定义的人,而不是严格意义上的 no 。这令人印象深刻,而且您已经非常接近了,但顺序很重要,您确实需要输出底部的这两个调用。

    一般来说,测试你的程序是否是一个 quine:

    ./my_quine > output
    diff my_quine output # should result in no differences
    

    如果您不使用脚本语言,显然可能会有一些微不足道的步骤:

    cc my_quine.c -o my_quine
    ./my_quine > output
    diff my_quine.c output
    

     javac MyQuine.java
     java MyQuine > output
     diff MyQuine.java output
    

    如果您直接通过解释器调用文件,从技术上讲,您可以在输入和输出中省略脚本语言文件顶部的 shebang(即#!/usr/bin/tclsh):

    tclsh my_quine.tcl > output
    diff my_quine.tcl output
    

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 2017-06-01
      • 2020-07-26
      • 2013-05-04
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多