Я хотел довести это до крайности и делать все динамически.
В сущности, приведенный ниже класс Chain позволяет объединять функции вместе, подобно макросам Clojure ->
и ->>
. Он поддерживает оба потока в первый и последний аргументы.
Функции разрешаются в следующем порядке:
- Метод объекта
- Локальная переменная
- Встроенная переменная
код:
class Chain(object):
def __init__(self, value, index=0):
self.value = value
self.index = index
def __getattr__(self, item):
append_arg = True
try:
prop = getattr(self.value, item)
append_arg = False
except AttributeError:
try:
prop = locals()[item]
except KeyError:
prop = getattr(__builtins__, item)
if callable(prop):
def fn(*args, **kwargs):
orig = list(args)
if append_arg:
if self.index == -1:
orig.append(self.value)
else:
orig.insert(self.index, self.value)
return Chain(prop(*orig, **kwargs), index=self.index)
return fn
else:
return Chain(prop, index=self.index)
Обрабатывать каждый результат как первый аргумент
file = Chain(__file__).open('r').readlines().value
Обрабатывать каждый результат как последний аргумент
result = Chain(range(0, 100), index=-1).map(lambda x: x * x).reduce(lambda x, y: x + y).value