Я разрабатываю API для библиотеки Python и столкнулся с ситуацией, когда я думаю, что мое воображение могло превзойти значительные способности Python.
(Я хочу извиниться перед всеми Pythonistas, которые могут обидеться из-за Рубина моего дизайна)
По сути, есть класс с несколькими методами, каждый из которых возвращает self
, так что они могут быть объединены в цепочку. Итак:
>>> a = MyKlass()
>>> b = a.method_one()
>>> c = b.method_two()
будет таким же, как
>>> a = MyKlass()
>>> c = a.method_one().method_two()
Мой вопрос заключается в том, можно ли сделать скобки необязательными. Я немного узнал об использовании __getattr__
и __call__
для манипулирования вызываемыми объектами, но не смог полностью реализовать это. Прямо сейчас у меня есть класс __getattr__
, проверяющий атрибут, а затем определяющий, является ли name
методом или атрибутом (или, точнее, можно ли его вызвать или нет).
Моя проблема в том, что если он вызывается, мне нужно __getattr__
сделать что-то вроде этого:
>>> 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
Таким образом, он возвращает вызываемый объект. Это означает, что я не могу сделать скобки необязательными, поскольку вызываемый объект будет возвращен, но никогда не будет вызван:
>>> a = MyKlass()
>>> c = a.method_one.method_two # AttributeError, since a bound function object does not have attribute "method_two"
Единственный способ, которым я подумал сделать это, это иметь возможность «заглядывать в будущее» в коде и определять, следует ли за name
скобка или нет. Затем, если name
был вызван, но не вызван, я мог бы вернуть результаты вызова name
без аргументов вместо возврата вызываемого объекта.
Я думаю, что это, вероятно, не выполнимо, но я подумал, что я все равно буду спрашивать гуру.