Function
そのインスタンスが 1 つの引数を取る callable であるclassがあるとします。これらのクラスの点ごとの演算を簡単な方法で定義しました。これが私のコードの簡略化されたバージョンです(実際には and でより複雑な動作をし__init__
て__call__
いますが、この質問には関係ありません):
class Function:
'''
>>> f = Function(lambda x : x**2)
>>> g = Function(lambda x : x + 4)
>>> h = f/g
>>> h(6)
3.6
'''
def __init__(self, func):
self.func = func
def __call__(self, value):
return self.func(value)
def __truediv__(self, other):
if isinstance(other, Function):
return Function(lambda x:self(x)/other(x))
else:
return NotImplemented
# ...
暗黙の型変換を許可しようとすると行き詰まります。たとえば、次のように書けるようになりたいです。
>>> f = Function(lambda x : x ** 2)
>>> g = f+1
>>> g(5)
26
言い換えれば、インスタンスv
の隣の算術式で数値オブジェクトを見るたびに、 に変換しFunction
たいと思います。v
Function(lambda x : v)
さらに、いくつかのユーザー定義型に対して同様の動作を実現したいと考えています (繰り返しますが、Function
オブジェクトを使用した同じバイナリ算術式でそれらを見るたびに)。
このロジックは、通常の二項算術演算子と反映された二項算術演算子のブルート フォースの組み合わせを使用してコード化できますが、それぞれisinstance(v, numbers.Number)
とをチェックしisinstance(v, MyUserDefinedType)
ますが、もっと洗練された方法があると思います。
また、私のデザインで他に改善点があれば教えてください。(Function
オブジェクトはめったに作成されませんが、非常に頻繁に呼び出されるため、パフォーマンスが重要です。)
編集:
@Eric のコメントに対処するには、別のユーザー定義クラスがあることを明確にする必要がありますFunctional
。
class Functional:
'''
>>> c = [1, 2, 3]
>>> f = Functional(lambda x : x + 1)
>>> f(c)
[2, 3, 4]
>>> g = Functional(lambda x : x ** 2)
>>> h = f + g
>>> h(c)
[3, 7, 13]
'''
def __init__(self, func):
self.func = func
@staticmethod
def from_function(self, function):
return Functional(function.func)
def __call__(self, container):
return type(container)(self.func(c) for c in container)
def __add__(self, other):
if isinstance(other, Functional):
return Functional(lambda x : self.func(x) + other.func(x))
else:
return NotImplemented
Function
同じ算術式で aとインスタンスの両方が表示される場合、メソッドを使用するように暗黙的に変換しFunctional
たいと考えています。Function
Functional
Functional.from_function
したがって、暗黙の型変換階層は次のようになります。
- 機能的
- 関数
- 他に何か
そして、特定の算術式で見られるこの階層の最上位の型に暗黙的に変換したいと思います。