使用Python创建自定义语言

时间:2012-04-29 21:27:52

标签: python sage

我最近开始玩Sage,我开始怀疑标准Python int是否包含在Sage中名为Integer的自定义类中。如果我在Python中键入type(1),我会得到<type 'int'>,但是,如果我在sage提示符中键入相同的内容,我会得到<type 'sage.rings.integer.Integer'>

如果我想用我自己的自定义类替换Python int(或listdict),那该怎么办呢?这有多难(例如,我可以完全用Python完成吗?)

3 个答案:

答案 0 :(得分:2)

您可以将所有Python的内置类型子类化。例如:

class MyInt(int):
    pass

i = MyInt(2)
#i is now an instance of MyInt, but still will behave entirely like an integer.

但是,您需要明确说明每个整数都是MyInt的成员。因此type(1)仍为int,您需要type(MyInt(1))

希望这与您正在寻找的相近。

答案 1 :(得分:2)

作为其他答案的补充:当运行任何代码时,Sage有一个预处理步骤,将Sage-Python转换为真正的Python(然后执行)。这是由preparse函数完成的,例如

sage: preparse('a = 1')
'a = Integer(1)'
sage: preparse('2^40')
'Integer(2)**Integer(40)'
sage: preparse('F.<x> = PolynomialRing(ZZ)')
"F = PolynomialRing(ZZ, names=('x',)); (x,) = F._first_ngens(1)"

这一步恰好允许透明地使用Integer s(代替int s)和其他非标准语法(如上面的多项式环示例和[a..b]等)。

据我所知,这是在Python中完全透明地使用内置类型替换的唯一方法。

答案 2 :(得分:1)

在Sage的情况下,这很容易。 Sage可以完全控制自己的REPL(读取 - 评估 - 打印循环),因此它可以解析您提供的命令,并将表达式的各个部分放入所需的任何类中。但是,标准Python自动将整数类型用于整数文字并不容易。简单地将内置int()重新分配给其他类型将不会这样做。您可以使用导入过滤器来执行此操作,该过滤器会扫描为(例如)整数文字导入的每个文件,并用MyInt(42)或其他任何内容替换它们。