Python Quine

A program that outputs itself.

In CS 6110 today, Dexter mentioned quines: programs that output their own source code. I quickly got sucked into a very fun internet rabbit-hole, including a collection of quines in different languages, a 128-language cyclical quine, a quine robust to mutations, and an HTML page that displays its own source.

I had to try it out for myself. Here’s what I came up with in Python 3:

from abc import ABC, abstractmethod
from string import ascii_lowercase


class AbstractQuine(ABC):

    imports = 'from abc import ABC, abstractmethod\n' \
              'from string import ascii_lowercase'

    @abstractmethod
    def print_code(self):
        ...


class Quine(AbstractQuine):

    def print_code(self):
        unmap = lambda x: x[0].replace('d', 'd\\n') + f' \\\n{s}{s}{s}  ' + x[1]
        s, n, q, t, r, b = '    ', '\n', '\'', '~', 'r', '\\'

        body = r'{self.imports}\n\n\nclass {self.__class__.__base__.__name__}~' \
               r'({ascii_lowercase[:3].upper()}):\n\n~' \
               r'{s}imports = {unmap(list(map(repr, self.imports.split(n))))}\n\n~' \
               r'{s}@abstractmethod\n{s}def print_code(self):\n{s}{s}...\n\n\n~' \
               r'class Quine({self.__class__.__base__.__name__}):\n\n~' \
               r'{s}def print_code(self):\n~' \
               r'{s}{s}unmap = lambda x: x[0].replace({q}d{q}, {q}d\\\\n{q})~' \
               r' + f{q} \\\\\\n{{s}}{{s}}{{s}}  {q} + x[1]\n~' \
               r'{s * 2}s, n, q, t, r, b = {q}    {q}, {repr(n)}, \'\\\'\', ~' \
               r'{q}{t}{q}, {q}r{q}, {q}{b}{b}{q}\n\n~' \
               r'{s * 2}body = {r}{q}{body.replace(t, t + q + s[1] + b + n + ~' \
               r'3 * s + s[:3] + r + q)}{q}\n\n~' \
               r'{s * 2}exec(f{q}print(f\"{{body.replace(t, \"\")}}\"){q})\n\n\n~' \
               r'{self.__class__.__name__}().print_code()'

        exec(f'print(f"{body.replace(t, "")}")')


Quine().print_code()

Some people might not like using exec, but I think it’s fair game. To verify that this is a quine, you can save the above code in quine.py and run python3 quine.py | diff quine.py - (make sure to have one newline after Quine().print_code()). Of course, much shorter quines are possible in Python, notably:

c='c=%r;print(c%%c)';print(c%c)

from Wikipedia, but it was fun to make something a bit longer work.

Avatar
Kiran Tomlinson
PhD Student, Computer Science

I’m a Computer Science PhD student at Cornell University advised by Jon Kleinberg and interested in a blend of algorithms, data science, and machine learning.