Выполнение sudo apt-get install libgtk2.0-0:i386
все еще давало мне ошибки при выполнении 12.04.
После выполнения sudo apt-get install ia32-libs-gtk
FortiSSL теперь работает гладко без любых ошибок.
Мы используем Jinja2 для заполнения шаблона. Это намного проще.
Шаблон очень похож на код Python с несколькими заменами {{something}}
.
Просто прочтите ваш комментарий к Wintermute, например:
У меня есть группа планет, которые Я хочу сохранить каждый как отдельный текст файлы. Я не особо привязан хранить их как исходный код Python, но я привязан к их созданию человекочитаемый.
Если это так, то, похоже, вам не нужны подклассы, но вы должны иметь возможность использовать один и тот же класс и различать планеты только по данным. И в таком случае, почему бы просто не записать данные в файлы и, когда вам нужны объекты планет в вашей программе, прочитать данные для инициализации объектов?
Если вам нужно сделать что-то вроде переопределения методов, я мог бы увидеть написания кода - но разве вы не должны иметь одни и те же методы для всех планет, просто используя разные переменные?
Преимущество простой записи данных (они могут включать информацию о типе меток для удобства чтения, которую вы бы пропустить при чтении) заключается в том, что программисты, не использующие Python, не будут отвлекаться при их чтении, вы можете использовать те же файлы с другим языком, если это необходимо, и т.
Это в значительной степени лучший способ сгенерировать исходный код Python . Однако вы также можете сгенерировать исполняемый код Python во время выполнения, используя библиотеку ast
. (Я связался с версией Python 3, потому что она более функциональна, чем версия 2.x.) Вы можете создать код, используя абстрактное синтаксическое дерево, а затем передать его в compile ()
для компиляции в исполняемый код. Затем вы можете использовать eval
для запуска кода.
Я не уверен, есть ли удобный способ сохранить скомпилированный код для использования позже (например, в .pyc
файл).
Я не уверен, особенно ли это 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)
Это, конечно, намного дороже в реализации, чем ваш пример, и я бы опасался слишком большого количества метапрограммирования, но это было забавное занятие. Вы можете расширить или использовать его по своему усмотрению; как насчет:
Было бы здорово услышать о том, с чем вы идете :)
Насколько я понимаю, вы пытаетесь сделать, я бы подумал об использовании отражения для динамического изучить класс во время выполнения и на его основе сгенерировать вывод. Есть хороший учебник по отражению (AKA самоанализ) по адресу http://diveintopython3.ep.io/ .
Вы можете использовать функцию dir ()
, чтобы получить список имен атрибутов данного объекта . Строка документа объекта доступна через атрибут __ doc __
. То есть, если вы хотите просмотреть строку документации функции или класса, вы можете сделать следующее:
>>> def foo():
... """A doc string comment."""
... pass
...
>>> print foo.__doc__
A doc string comment.