私はPythonライブラリ用のAPIを設計しており、私の想像力がPythonのかなりの能力を追い越したと思われる状況に遭遇しました。Python API - オプションの括弧を作成するためのパターン?
(私は私のデザインのルビーネスで怒られるかもしれません任意のPythonistasに謝罪したい)
ように基本的には、self
を返し、それぞれがその上にいくつかのメソッドを持つクラスは、そこにあります彼らは一緒に鎖を張ることができます。だから、:
>>> a = MyKlass()
>>> b = a.method_one()
>>> c = b.method_two()
は、私の質問は、カッコはオプションにすることが可能であるかどうかである
>>> a = MyKlass()
>>> c = a.method_one().method_two()
と同じになります。私は__getattr__
と__call__
を使用して呼び出し可能なオブジェクトを操作する方法について少しは学んだが、これを完全に実装することはできませんでした。今、クラスの__getattr__
で属性をチェックしてから、name
がメソッドか属性(またはより正確には呼び出し可能かどうか)を判断します。
>>> class MyKlass(object):
>>> def __getattr__(self, name):
>>> # pseudocode, you get the idea...
>>> if name is callable:
>>> def callme(*args, **kwds):
>>> # do stuff
>>> return callme
>>> else:
>>> # just return the attribute
だから、呼び出し可能オブジェクトを返します。
私の問題は、それが呼び出し可能であるならば、私はこのような何かを__getattr__
が必要だということです。これを行うには、私が考え
>>> a = MyKlass()
>>> c = a.method_one.method_two # AttributeError, since a bound function object does not have attribute "method_two"
唯一の方法は、「できるようにするには、次のようになります。これは、呼び出し可能オブジェクトが返されますが、呼び出されることはありませんされるので、私は、カッコはオプションにすることができなかったこと、しかし、意味しますコード内で先読みして、name
にかっこが付いているかどうかを判断します。次に、name
が呼び出し可能であっても呼び出されなかった場合、呼び出し可能オブジェクトを返す代わりに、引数なしでname
を呼び出した結果を返すことができました。
これはおそらく実行できないと思っていますが、とにかく私は指導者に尋ねると思っていました。
プロパティでない場合は、暗黙的に呼び出されるべきではありません。それは絶対にしないでください。特に図書館で。 PythonはRubyではありません。 –
はい...それは有用ではなく、あなたの図書館を使用する人に多大な混乱を招くかもしれません。 – Ant
私は皆さんの大声ではっきりと聞きました。私は受け入れられた答えとして@ FogleBirdの答えをマークしていますが、私は皆さんがまっすぐで狭いところに私を置くことに感謝します。 –