четверг, 25 марта 2010 г.

Код, который печатает себя на python

Когда-то мой друг задал мне задачку: написать код, который печатает себя, но без использования печати текста из файла. Результат получился следующий:
#!/usr/bin/python
body= ['#!/usr/bin/python', '#', 'for line in body:', '   if line == "#": print "body=",body', '   else: print line']
for line in body:
   if line == "#": print "body=",body
   else: print line

При запуске скрипта на экран выводится точно такой же код, как видно в листинге выше

Если кто-то может подсказать более изящное решение, буду признателен.

4 комментария:

  1. первый шаг по переносу постов с http://blog.ownport.net на http://devel.ownport.net, затрагивающие вопросы разработки и интернет-технологии

    ОтветитьУдалить
  2. если идти по пути использования стандартных библиотек, то можно попробовать поколдовать над:

    import inspect
    print( inspect.getsource( inspect.currentframe()))

    только это не готовое решение. фрейм ещё двигать надо вперёд - пока выводит только "import inspect"

    ОтветитьУдалить
  3. Ух ти! То ти добре знаєш пітон! :)
    Тут є кілька прикладів: http://www.nyx.net/~gthompso/self_pyth.txt

    ОтветитьУдалить
  4. После твоей ссылки я думаю мне еще учиться и учиться :)

    Краткость сестра таланта:

    Author: Frank Stajano (fstajano@orl.co.uk)

    l='l=%s;print l%%`l`';print l%`l`


    Author: Greg Stein (gstein@microsoft.com)

    x='x=%s\012print x%%`x`'
    print x%`x`


    Author: Terry Reedy (tjreedy@udel.edu)
    Note: works as a command line input string

    import sys;f=sys.stdout;
    x='import sys;f=sys.stdout;x=%s;f.write(x%%`x`)';f.write(x%`x`)


    Author: Terry Reedy (tjreedy@udel.edu)
    Note: works as an interactive string input. The double quotes could theoretically be removed.

    "x='x=%s;x%%`x`';x%`x`"


    Author: Omar Antolin (omar@galois.fciencias.unam.mx)

    a = ['print "a =", a', 'for s in a: print s']
    print "a =", a
    for s in a: print s


    Author: Magnus Lie Hetland
    Note: bash command line that runs a Python command

    python -c "x='python -c %sx=%s; print x%%(chr(34),repr(x),chr(34))%s'; print x%(chr(34),repr(x),chr(34))"

    ОтветитьУдалить