Вам нужен глубокий взлом байт-кода - то, что вы запрашиваете, не может быть выполнено на уровне исходного кода Python, но (если вы хотите зафиксировать определенную версию и выпускPython) может быть выполнимо путем последующей обработки байт-кода после того, как Python скомпилирует его.Рассмотрим, например:
>>> def f(someit):
... a, b, c = someit()
...
>>> dis.dis(f)
2 0 LOAD_FAST 0 (someit)
3 CALL_FUNCTION 0
6 UNPACK_SEQUENCE 3
9 STORE_FAST 1 (a)
12 STORE_FAST 2 (b)
15 STORE_FAST 3 (c)
18 LOAD_CONST 0 (None)
21 RETURN_VALUE
>>>
Как вы видите, байт-код UNPACK_SEQUENCE 3
происходит без указания итератором someit
наименьшего указания (итератор уже был вызван!) - так что вы должныдобавьте к байт-коду префикс с помощью операции «получить ровно N байтов», например:
>>> def g(someit):
... a, b, c = limit(someit(), 3)
...
>>> dis.dis(g)
2 0 LOAD_GLOBAL 0 (limit)
3 LOAD_FAST 0 (someit)
6 CALL_FUNCTION 0
9 LOAD_CONST 1 (3)
12 CALL_FUNCTION 2
15 UNPACK_SEQUENCE 3
18 STORE_FAST 1 (a)
21 STORE_FAST 2 (b)
24 STORE_FAST 3 (c)
27 LOAD_CONST 0 (None)
30 RETURN_VALUE
, где limit
- ваша собственная функция, легко реализуемая (например, через itertools.slice
).Таким образом, исходная 2-байтная последовательность «загрузка быстро; вызов функции» (непосредственно перед байт-кодом последовательности распаковки) должна стать 5-байтной последовательностью с глобальным байт-кодом загрузки для limit
перед исходной последовательностью, ипоследовательность load-const; call function
после нее.
Вы, конечно, можете реализовать эту обработку байт-кода в декораторе.
В качестве альтернативы (для общности) вы можете работать над изменением исходного источника функции, например, путем анализаи изменение AST, и перекомпиляция в байт-код (но для этого, разумеется, требуется, чтобы исходный код был доступен во время оформления).
Стоит ли оно того для производственного использования?Конечно, нет - нелепый объем работы для незначительного улучшения «синтаксического сахара».Тем не менее, это может быть поучительный проект для достижения мастерства в взломе байт-кода, аст-хакерстве и других уловках черной магии, которые вам, вероятно, никогда не понадобятся, но, безусловно, здорово знать, когда вы хотите выйти за рамки простого языка мастераэто гуру мирового класса - на самом деле я подозреваю, что те, кто мотивирован стать гуру, как правило, люди, которые не могут не поддаться очарованию такой "механики внутренних языков" ... и те, кто на самом деле сделать это на этом возвышенном уровне достаточным подмножеством, чтобы понять, что такие усилия «просто играют», и преследовать их как занятие в свободное время (умственный эквивалент поднятия тяжестей, очень похожий, скажем, на судоку или кроссворды; -) не позволяя им мешать выполнению важных задач (повышая ценность для пользователей путем развертывания надежного, ясного, простого, хорошо работающего, хорошо протестированного, хорошо документированного кода, чаще всего без даже малейшего намека на черный цветмагия к нему; -).