Вам необходимо указать отсутствующий аргумент. Одним из способов является использование замыкания , реализованного вложенной функцией.
Здесь при вызове test_wrapper(market_identification)
создается новая функция, которая уже имеет необходимый аргумент внутри. Именно эта сгенерированная функция будет затем вызываться каркасом расписания.
def test(market_identification):
print(f"test {market_identification}")
def test_wrapper(mi):
def inner():
return test(mi)
return inner
for time_of_execution, market_identification in zip(execution_time_list, marketId_list):
schedule.every().tuesday.at(time_of_execution).do(test_wrapper(market_identification))
print(f"scheduled {market_identification} at {time_of_execution}")
while True:
schedule.run_pending()
time.sleep(1)
Для простой демонстрации вы можете немедленно вызвать сгенерированную функцию: test_wrapper("hello")()
приводит к выводу
test hello
Поскольку этот вариант использования для вложенной функции очень распространен, при использовании метода functools.partial
стандартная библиотека предоставляет вам небольшой помощник для этого:
from functools import partial
for time_of_execution, market_identification in zip(execution_time_list, marketId_list):
schedule.every().tuesday.at(time_of_execution).do(partial(test, market_identification))
print(f"scheduled {market_identification} at {time_of_execution}")
Обратите внимание, что while
l oop не должен находиться во внутреннем l oop. Это должно быть выполнено после того, как все планировщики были установлены. Я предполагаю, что отступ был испорчен в исходном коде. Это исправлено в моем ответе выше.
Обновление: Сначала я пропустил ту часть, где вы объясняете, что каждый раз должен использоваться только один идентификатор рынка. В этом случае вам нужны не два вложенных цикла, а один l oop, который zip
s * execution_time_list
и marketId_list
. Я обновил свой ответ соответственно.