Python寥雪峰:Python生成 Python

我有一组对象,我正在创建一个类,我想将每个对象存储为自己的文本文件。我真的很想将它存储为 Python 类定义,它对我正在创建的主类进行子类化。所以,我做了一些探索,并在 effbot.org 上找到了一个 Python Code Generator。我做了一些实验,这里是我想出的:

#
# 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')

这感觉真的很难看,有一个更清洁 / 更好 / 更多的 Python 的方式来做到这一点?请注意,这不是我真正打算这样做的类,这是一个小类,我可以很容易地模拟在没有太多的行。此外,子类不需要在其中有生成函数,如果我再次需要,我可以从超类调用代码生成器。

35

我们使用 Jinja2 来填充一个模板。

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

10

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

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

7

只需阅读您对 Wintermute 的评论-即:

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

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

如果你需要做的东西,如重写方法,我可以看到写出来的代码-但你不应该只是能够有所有的行星相同的方法,只是使用不同的变量?

只写数据的优点(它可以包括标签类型信息的可读性,你会跳过,当你读它)是,非 Python 程序员不会分心阅读时,你可以使用相同的文件与一些其他语言,如果有必要,等等。

1

我不知道这是否是特别的 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)

当然,这比你的例子要昂贵得多,我会警惕太多的元编程,但这是一个有趣的练习。

添加写入方法并将 stdout 重定向到此对象以直接打印到脚本文件

从它继承以自定义输出

添加属性 getter 和 setter

很高兴听到你的任何消息:)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(429)
Python中sympy:在python中绘制sympy结果
上一篇
C6h6化学名称:使用rdkit或其他python模块将SMILES转换为化学名称或IUPAC名称
下一篇

相关推荐

  • python 大文件处理:如何使用Python处理大型文件

    Python 大文件处理指的是处理超过内存可以容纳的大文件。这种情况下,我们可以使用 Python 的内置函数 open() 来打开文件,并使用 read() 或 readlines() 来读取文件内容,以及 write() 来写入文件内容。…

    2023-08-11 13:08:46
    0 77 33
  • python培训心得体会:学习Python,拓展自我的可能性

    示例示例参加python培训,我受益匪浅。我深刻体会到了python的强大之处,它是一种高效、易学、易用的编程语言,可以让我们快速的实现编程思想,有效的提升编程效率。我也深刻理解了python的语法特点,比如变量、函数、类、模块等,以及它们之间的关系,这对以后的编程工作有很大的帮助。我还学习到了如何使用python进行数据处理,以及如何使用python实现web应用,这些都非常有用。下面是一个简单的python代码示例,用来计算1到100的和:…

    2023-07-19 02:14:49
    0 97 82
  • python求质因数:Python实现质因数分解的算法

    Python求质因数是指把一个正整数分解成若干个质数的乘积,这些质数就是该数的质因数。下面是一个Python代码实现求质因数的例子:…

    2023-03-04 13:27:16
    0 33 40
  • python基础问题:如何使用Python提高编程效率

    示例示例Python基础问题:如何在Python中定义函数答:在Python中定义函数的语法如下:def):…

    2023-07-19 07:08:57
    0 45 66
  • python面向:如何使用Python面向对象编程

    Python面向对象是一种面向对象编程(OOP)的范例,它能够让你创建可重用的代码,这样你就可以在构建应用程序时使用它们。下面是一个简单的Python面向对象的示例:…

    2023-04-01 09:37:30
    0 73 13
  • python计算1到100的和5050

    Python计算1到100的和的代码如下:上面的代码使用for循环来遍历1到100的数字,每次将遍历到的数字加到sum中,最后输出sum的值即可。…

    2023-10-03 12:08:18
    0 34 23
  • python 列表元素替换:使用Python创建美丽的图像

    Python 列表元素替换是指将列表中的某个元素替换成另一个元素,可以使用列表的 index() 方法和 insert() 方法来实现。…

    2023-08-29 09:24:30
    0 21 94
  • python prod函数:如何使用Python函数prod来提高生产效率

    Python prod 函数是一个内置函数,用于计算可迭代对象中元素的乘积。它接受一个可迭代对象作为参数,并返回该可迭代对象中元素的乘积。…

    2023-02-09 14:50:30
    0 21 61

发表评论

登录 后才能评论

评论列表(63条)