У меня есть много функций, которые иногда должны зацикливаться, иногда не должны. Я хочу встроить опцию, чтобы он работал в цикле. Вот мой код. Вы можете видеть, что каждая функция имеет оператор if... else. Есть ли способ поместить оператор if... else в метод loop? Значит, мне не нужно повторять эти строки для каждой функции?
import inspect
def test1(b,shouldloop=False):
if not shouldloop:
a = b + 1
print a
else:
loop(lambda z: test1(z) , inspect.currentframe().f_code.co_name)
def test2(d,e,shouldloop=False):
if not shouldloop:
a = d * e
print a
else:
loop(lambda z: test2(z,e) , inspect.currentframe().f_code.co_name)
def test3(g,h,i,shouldloop=False):
if not shouldloop:
a = g **2 - h + i
print a
else:
loop(lambda z: test3(z,h,i) , inspect.currentframe().f_code.co_name)
def loop(function,c):
x = [1,2,3,4]
for i in x:
function (i)
print c
поэтому иногда мне просто нужна функция test1, чтобы не зацикливаться так ...
test1(2)
вывод:
3
и иногда мне нужно, чтобы он так зацикливался ...
test1('',True)
вывод:
2
test1
3
test1
4
test1
5
test1
В других тестовых функциях больше переменных. Но я буду использовать их так же.
Я согласен с @Sayse, это довольно сложно. Можете ли вы дать более четкое объяснение своего кода?
Поскольку вы выполняете 6 отдельных операций в 3 наборах блоков if... else..., вероятно, лучше всего оставить это так. Я боюсь, что любые другие попытки передать набор блока if... else..., который выполняет разные вещи в разные функции, будут просто беспорядком.






Вы можете переписать 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
Я не понимаю вашу логику здесь, что должен выводить этот код? Кроме того, вместо использования
'yes'для вашегоshouldloopвы должны просто использовать логическое значение