非常快的问题。我想知道是否有任何软件Django软件自动生成python编码。如果有,请告诉我。
答案 0 :(得分:7)
答案 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,甚至是测试!