最好的python / Django代码生成器?

时间:2010-10-28 09:09:04

标签: python html django generator

非常快的问题。我想知道是否有任何软件Django软件自动生成python编码。如果有,请告诉我。

4 个答案:

答案 0 :(得分:7)

让我们不要用讽刺言论来宣传新的pythonistas ......也许OP有合法的代码生成需求。

试试这些:

Cheetah

Cog

Jinja2

玩得开心!

答案 1 :(得分:1)

我从未听说过python代码生成器。 Python是一种动态语言,几乎可以做任何事情。我认为你可以在大多数情况下编写几个等效的Python行,而不是依赖于Java世界中已知的静态代码生成器,这样更方便。

如果您正在寻找Python词法分析器/解析器,请尝试pyparsing

答案 2 :(得分:0)

我在Python中看到的最接近代码生成的是Python的__metaclass__功能。例如,这是一个简单的元类来创建只读属性:

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,因为这是一个只读属性。

答案 3 :(得分:0)

签出Django Builder ...真的很酷...上传一个models.py文件,它会生成更好的models.py,以及CRUD视图模板,API /序列化器,admin.py,urls.py,甚至是测试!

https://mmcardle.github.io/django_builder/#!/home