1

私は最近 Sage をいじり始めましたが、標準の Pythonintが Sage と呼ばれるカスタマイズされたクラスにラップされているのではないかと疑うようになりましたIntegertype(1)Python で入力すると が表示<type 'int'>されますが、sage プロンプトで同じことを入力すると が表示されます<type 'sage.rings.integer.Integer'>

intPython (またはlistまたは) を独自のカスタム クラスに置き換えたい場合dict、どのようにすればよいでしょうか? どのくらい難しいでしょうか (たとえば、完全に Python で行うことはできますか)?

4

3 に答える 3

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)ます。inttype(MyInt(1))

うまくいけば、それはあなたが探しているものに近いです.

于 2012-04-29T21:43:48.907 に答える
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 の組み込み型の置換を完全に透過的に使用する唯一の方法です。

于 2012-04-30T10:58:21.953 に答える
1

Sageの場合は簡単です。Sage は独自の REPL (read-evaluate-print ループ) を完全に制御できるため、与えられたコマンドを解析し、式の一部を任意のクラスに変換できます。ただし、標準の Python で整数型を整数リテラルに自動的に使用させるのはそれほど簡単ではありません。ビルトインをint()他のタイプに再割り当てするだけでは、それはできません。おそらく、インポートされた各ファイルをスキャンして(たとえば)整数リテラルをスキャンし、それらをMyInt(42)何かに置き換えるインポートフィルターを使用して実行できます。

于 2012-04-29T21:58:38.073 に答える