2012-04-29 141 views
1

我最近開始使用Sage,我開始懷疑標準Python int被封裝在Sage中的一個名爲Integer的自定義類中。如果我在Python中輸入type(1),我得到<type 'int'>,但是,如果我在sage提示符中輸入相同的東西,我會得到<type 'sage.rings.integer.Integer'>使用Python創建自定義語言

如果我想用自己的自定義類替換Python int(或listdict),它可能會怎麼做?它會有多困難(例如,我可以完全用Python來完成)嗎?

回答

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秒(代替int S)和其它非標準語法(像上面的多項式環例子和[a..b]等)。

據我所知,這是完全透明地使用Python中的內置類型的替代品的唯一方法。

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

就Sage而言,這很簡單。 Sage完全控制自己的REPL(read-evaluate-print循環),所以它可以解析你給它的命令,並把你的表達部分變成它想要的任何類。但是,標準Python自動使用整數類型的整數類型並不容易。簡單地將內置的int()重新分配給其他類型不會。你可以用一個導入過濾器來完成它,它會掃描每個輸入的(比如說)整數文字的文件,並用MyInt(42)或者其他的替換它們。