Вы можете переписать loop
как декоратор, чтобы добавить его вокруг произвольных функций:
import functools
def loopable(fnc): # decorator, takes any function
@functools.wraps(fnc)
def fncloop(*args, shouldloop=False, **kwargs): # take loop switch and arguments for the actual function
if shouldloop: # loop logic
x = [1,2,3,4]
for i in x:
fnc(i, *args[1:], **kwargs) # replace first argument with i
print(fnc.__name__)
else:
fnc(*args, **kwargs) # call function unconditionally
return fncloop # return wrapped function
Примените его при определении функции, которая просто содержит тело цикла:
@loopable
def test1(b):
a = b + 1
print(a)
Любая декорированная функция теперь поддерживает shouldloop
:
>>> test1(2)
3
>>> test1(2, shouldloop=True)
2
test1
3
test1
4
test1
5
test1
Для Python 2 вам нужно явно извлечь аргумент из kwargs
:
import functools
def loopable(fnc):
@functools.wraps(fnc)
def fncloop(*args, **kwargs):
if kwargs.pop('shouldloop', False):
x = [1,2,3,4]
for i in x:
fnc(i, *args[1:], **kwargs) # replace first argument with i
print(fnc.__name__)
else:
fnc(*args, **kwargs)
return fncloop