Я бы использовал декоратор в функции для отслеживания того, сколько раз он выполняется.
def run_once(f):
def wrapper(*args, **kwargs):
if not wrapper.has_run:
wrapper.has_run = True
return f(*args, **kwargs)
wrapper.has_run = False
return wrapper
@run_once
def my_function(foo, bar):
return foo+bar
Теперь my_function
будет работать только один раз. Другие вызовы вернутся None
. Просто добавьте предложение else
к if
, если хотите, чтобы оно возвращало что-то еще. По вашему примеру, ничего не нужно возвращать никогда.
Если вы не управляете созданием функции или ее необходимо нормально использовать в других контекстах, вы также можете просто применить декоратор вручную.
action = run_once(my_function)
while 1:
if predicate:
action()
Это оставит my_function
доступным для других целей.
Наконец, если вам нужно запустить его только один раз дважды, тогда вы можете просто сделать
action = run_once(my_function)
action() # run once the first time
action.has_run = False
action() # run once the second time