2010-10-28 2 views
0

очень быстрый вопрос. Мне интересно, есть ли программное обеспечение Django для программного обеспечения, которое автоматически генерирует кодирование python. Если есть, пожалуйста, дайте мне знать.Лучший генератор кода python/Django?

+4

Я чувствую запах разработчика Java. –

+0

Lol Я не разработчик Java – Shehzad009

+3

Какой из них? C#? Потому что почти смешно думать о генераторе кода Python, учитывая его низкое количество шаблонов. –

ответ

1

Я никогда не слышал о генераторах кода python. Python - динамический язык, где вы можете делать практически все. Вместо того, чтобы полагаться на статические генераторы кода, известные из мира Java, я бы сказал, что вы можете написать пару эквивалентных строк Python в большинстве случаев, что является более удобным.

Если вы ищете лексер/парсер Python, попробуйте pyparsing.

+0

Хорошо, я проверю это – Shehzad009

+0

Хороший совет, но это не то, что он просил. –

0

Ближайшая вещь, которую я видел в Python для генерации кода, - это функция __metaclass__ Python. Например, вот простой метаклассом создать только для чтения свойства:

class ReadonlyProperties(type): 
    def __init__(cls, name, bases, attrs): 
     props = attrs.get("props",[]) 
     if props: 
      # generate property for each name in propnames 
      def defineProperty(p): 
       return property(lambda self: getattr(self, '_'+p)) 
      for p,_ in props: 
       setattr(cls, p, defineProperty(p)) 

      # generate wrapper for __init__ to initialize property values 
      if "__init__" in attrs: 
       setattr(cls, "__orig_init__", attrs["__init__"]) 
      else: 
       setattr(cls, "__orig_init__", None) 
      def new__init__fn(self, *args, **kwargs): 
       if self.__orig_init__: 
        self.__orig_init__(*args) 
       for p,pdefault in props: 
        if p in kwargs: 
         setattr(self, '_'+p, kwargs[p]) 
        else: 
         setattr(self, '_'+p, pdefault) 
      setattr(cls, "__init__", new__init__fn) 

      # generate __str__ function 
      def __repr__fn(self): 
       return "%s(%s)" % (name, ','.join("%s=%s" % (p,getattr(self,p)) for p,_ in props)) 
      setattr(cls, "__repr__", __repr__fn) 

      # don't need this class property any more 
      delattr(cls, "props") 

Теперь вот метаклассом в действии:

class Coord3D(object): 
    __metaclass__ = ReadonlyProperties 
    props = [('x',0), ('y',0), ('z',0)] 

pt = Coord3D(x=100, y=200) 
print repr(pt) 
print pt.x 
print [n for n in dir(pt) if not n.startswith('__')] 

Печать:

Coord3D(x=100,y=200,z=0) 
100 
['_x', '_y', '_z', 'x', 'y', 'z'] 

Присвоение pt.x возбудит AttributeError, поскольку это свойство readonly.

6

Давайте не будем запускать новые питонисты со снисходительными замечаниями ... возможно, у ОП были законные потребности в генерации кода.

Попробуйте эти:

Cheetah

Cog

Jinja2

получайте удовольствие!