首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python生成Python

Python生成Python
EN

Stack Overflow用户
提问于 2009-09-01 21:02:28
回答 5查看 34.2K关注 1票数 22

我有一组对象,我正在为它们创建一个类,我想将每个对象存储为它自己的文本文件。我真的希望将它存储为Python类定义,它是我正在创建的主类的子类。因此,我做了一些探索,在effbot.org上找到了Python代码生成器。我用它做了一些实验,这是我想出来的:

代码语言:javascript
代码运行次数:0
运行
复制
#
# a Python code generator backend
#
# fredrik lundh, march 1998
#
# fredrik@pythonware.com
# http://www.pythonware.com
#
# Code taken from http://effbot.org/zone/python-code-generator.htm

import sys, string

class CodeGeneratorBackend:

    def begin(self, tab="\t"):
        self.code = []
        self.tab = tab
        self.level = 0

    def end(self):
        return string.join(self.code, "")

    def write(self, string):
        self.code.append(self.tab * self.level + string)

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

    def dedent(self):
        if self.level == 0:
            raise SyntaxError, "internal error in code generator"
        self.level = self.level - 1

class Point():
    """Defines a Point. Has x and y."""
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def dump_self(self, filename):
        self.c = CodeGeneratorBackend()
        self.c.begin(tab="    ")
        self.c.write("class {0}{1}Point()\n".format(self.x,self.y))
        self.c.indent()
        self.c.write('"""Defines a Point. Has x and y"""\n')
        self.c.write('def __init__(self, x={0}, y={1}):\n'.format(self.x, self.y))
        self.c.indent()
        self.c.write('self.x = {0}\n'.format(self.x))
        self.c.write('self.y = {0}\n'.format(self.y))
        self.c.dedent()
        self.c.dedent()
        f = open(filename,'w')
        f.write(self.c.end())
        f.close()

if __name__ == "__main__":
    p = Point(3,4)
    p.dump_self('demo.py')

这感觉真的很难看,有没有更干净/更好/更有蟒蛇风格的方法呢?请注意,这不是我实际打算使用的类,这是一个很小的类,我可以很容易地在不太多的行中模拟。此外,子类中不需要包含生成函数,如果我再次需要生成函数,我可以从超类调用代码生成器。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-01 21:21:48

我们使用Jinja2来填充模板。这要简单得多。

这个模板看起来很像Python代码,但其中有一些{{something}}替换项。

票数 34
EN

Stack Overflow用户

发布于 2009-09-01 21:20:36

这几乎是生成Python源代码的最佳方式。但是,您也可以在运行时使用ast库生成Python可执行代码。您可以使用抽象语法树构建代码,然后将其传递给compile()以将其编译为可执行代码。然后,您可以使用eval()运行代码。

我不确定是否有一种方便的方法来保存编译后的代码以供以后使用(即。在.pyc文件中)。

票数 8
EN

Stack Overflow用户

发布于 2009-09-01 23:39:09

只要读一读你对wintermute的评论--即:

我所拥有的是一堆行星,我想把它们存储为各自的文本文件。,

。我不是特别喜欢将它们存储为python源代码,但我喜欢让它们变得可读。

如果是这样,那么似乎你不应该需要子类,但应该能够使用相同的类,并仅通过数据来区分行星。在这种情况下,为什么不直接将数据写入文件,当需要程序中的planet对象时,读取数据来初始化对象呢?

如果你需要做一些事情,比如重写方法,我可以写出代码-但是你不是应该能够对所有的行星都有相同的方法,只是使用不同的变量吗?

直接写出数据的好处是,非Python程序员在读取数据时不会分心,如果需要,可以用其他语言使用相同的文件,等等。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1364640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档