目標: 特定のコンテキストでのみ有効なロールを使用して、任意のクラスを拡張します。
これは機能します:
# from https://github.com/niccokunzmann/wwp/blob/master/C_builtinTypes.py
from relative import roleOf, useRoles
@roleOf(int)
class NaturalNumber:
# int gets successor only in this module
@property
def successor(self):
return 1 + self
@roleOf(tuple)
@roleOf(list)
class MyList:
@property
def first(self):
return self[0]
@useRoles
def test():
# this is possible if we recompile the code objects
i = 1
print(type(i))
assert i.successor == 2
assert i.successor.successor == 3
assert isinstance(i, int) # EDIT3 works
# check for identity
t = (3,)
assert t.first == 3
l = list()
l.append(3)
assert l.first == 3 # this assertion fails
assert l.first == 2 + 1
if __name__ == '__main__':
test()
私の問題:
EDIT2:これを機能させるために、通常のpythonクラス用に100行のコードを書きましたが、ビルトイン用に250行追加しましたが、完全な解決策は見えません。
純粋な python クラスをlink:Aまたはlink:Bとして作成できるように、組み込みオブジェクトのカスタム クラスを作成することはできません。これは、コンパイラがそれらをどこにでも配置するためです。
>>> test.__code__.co_consts
(None, 1, 2, 3, (3,), 3)
コードに組み込まれているため、コード オブジェクトをリストに置き換えることはできません。
私はそれを見積もることができないので、これらは私の質問です:
組み込みオブジェクトをラッパーに置き換えてロールを追加できるようにするには、どの場所を探す必要がありますか?
ブール値のロールを作成できるように、属性ルックアップにパッチを適用するのに C 拡張が役立ちますか?
このアイデアを機能させるには、独自の python をコンパイルする必要がありますか?
別の解決策はありますか?
編集1
これは私のユースケースの 1 つです: 1 .successor.successor == 3
. プログラム全体に干渉しない小さなドメインを持つことを簡単にしたい=クラスをスリムに保つ.
たとえば、ラムダ計算を作成するために数値を呼び出し可能にしたいと考えています。
私はスリムなクラスを持ちたいのですが、特別なユースケースでは、カスタム関数を呼び出すことができるようにロールで拡張したいと考えています。Data-Context-Interactionと Context-Oriented Programmingの間の何かが出てくるはずです。