Python, генерирующий Python

Выполнение sudo apt-get install libgtk2.0-0:i386 все еще давало мне ошибки при выполнении 12.04.

После выполнения sudo apt-get install ia32-libs-gtk FortiSSL теперь работает гладко без любых ошибок.

16
задан Matthew Murdoch 28 October 2012 в 07:08
поделиться

5 ответов

Мы используем Jinja2 для заполнения шаблона. Это намного проще.

Шаблон очень похож на код Python с несколькими заменами {{something}} .

28
ответ дан 30 November 2019 в 16:14
поделиться

Просто прочтите ваш комментарий к Wintermute, например:

У меня есть группа планет, которые Я хочу сохранить каждый как отдельный текст файлы. Я не особо привязан хранить их как исходный код Python, но я привязан к их созданию человекочитаемый.

Если это так, то, похоже, вам не нужны подклассы, но вы должны иметь возможность использовать один и тот же класс и различать планеты только по данным. И в таком случае, почему бы просто не записать данные в файлы и, когда вам нужны объекты планет в вашей программе, прочитать данные для инициализации объектов?

Если вам нужно сделать что-то вроде переопределения методов, я мог бы увидеть написания кода - но разве вы не должны иметь одни и те же методы для всех планет, просто используя разные переменные?

Преимущество простой записи данных (они могут включать информацию о типе меток для удобства чтения, которую вы бы пропустить при чтении) заключается в том, что программисты, не использующие Python, не будут отвлекаться при их чтении, вы можете использовать те же файлы с другим языком, если это необходимо, и т.

7
ответ дан 30 November 2019 в 16:14
поделиться

Это в значительной степени лучший способ сгенерировать исходный код Python . Однако вы также можете сгенерировать исполняемый код Python во время выполнения, используя библиотеку ast . (Я связался с версией Python 3, потому что она более функциональна, чем версия 2.x.) Вы можете создать код, используя абстрактное синтаксическое дерево, а затем передать его в compile () для компиляции в исполняемый код. Затем вы можете использовать eval для запуска кода.

Я не уверен, есть ли удобный способ сохранить скомпилированный код для использования позже (например, в .pyc файл).

5
ответ дан 30 November 2019 в 16:14
поделиться

Я не уверен, особенно ли это Pythonic, но вы можете использовать перегрузку оператора:

class CodeGenerator:
    def __init__(self, indentation='\t'):
        self.indentation = indentation
        self.level = 0
        self.code = ''

    def indent(self):
        self.level += 1

    def dedent(self):
        if self.level > 0:
            self.level -= 1

    def __add__(self, value):
        temp = CodeGenerator(indentation=self.indentation)
        temp.level = self.level
        temp.code = str(self) + ''.join([self.indentation for i in range(0, self.level)]) + str(value)
        return temp

    def __str__(self):
        return str(self.code)

a = CodeGenerator()
a += 'for a in range(1, 3):\n'
a.indent()
a += 'for b in range(4, 6):\n'
a.indent()
a += 'print(a * b)\n'
a.dedent()
a += '# pointless comment\n'
print(a)

Это, конечно, намного дороже в реализации, чем ваш пример, и я бы опасался слишком большого количества метапрограммирования, но это было забавное занятие. Вы можете расширить или использовать его по своему усмотрению; как насчет:

  • добавления метода записи и перенаправления stdout на объект этого для печати прямо в файл сценария
  • , наследующий от него, чтобы настроить вывод
  • добавление методов получения и установки атрибутов

Было бы здорово услышать о том, с чем вы идете :)

1
ответ дан 30 November 2019 в 16:14
поделиться

Насколько я понимаю, вы пытаетесь сделать, я бы подумал об использовании отражения для динамического изучить класс во время выполнения и на его основе сгенерировать вывод. Есть хороший учебник по отражению (AKA самоанализ) по адресу http://diveintopython3.ep.io/ .

Вы можете использовать функцию dir () , чтобы получить список имен атрибутов данного объекта . Строка документа объекта доступна через атрибут __ doc __ . То есть, если вы хотите просмотреть строку документации функции или класса, вы можете сделать следующее:

>>> def foo():
...    """A doc string comment."""
...    pass
...
>>> print foo.__doc__
A doc string comment.
1
ответ дан 30 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: