@Aquinary
Хинафаг.

Почему данный код является рабочим?

Всем доброго времени суток!
Имеется такой код:
while (1):
    for iterator in range(len(posts)):
        # Для прозрачности вычислений
        time_post_a = datetime.now()
        time_post_a = int(time.mktime(time_post_a.timetuple()))

        time_post_b = posts[iterator]['time']
        time_post_b = int(time.mktime(time_post_b.timetuple()))

        # Выполнить действие, в случае, если "время пришло" по массиву posts
        if ((time_post_a - time_post_b) == 0):
            print ('Итератор: ' + str(iterator) + ', Новая публикация: ' + str(posts[iterator]['time']))
            time.sleep(1) # Если его убрать, то начинаются дикие пляски
            break

Он работает(!!!). Но не кажется достаточно прозрачным... например, в голову не приходит здравой идеи о том, как выводит отсчёт вплоть до секунд, до наступления событий. Так же он не может вывести список того, что уже просрочено по времени.
В общем, код явного пахнет костылём... интересно, каким образом можно сделать его лучше?
Основная задача - вызов условия по времени, которое заранее задано
  • Вопрос задан
  • 435 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
Если бы был конкурс на написание самого кривого планировщика событий (task scheduler) - этот код, несомненно, занял бы первое место) Попробуйте, например, delayed calls в asyncio.

UPD Пример простого решения "в лоб", без асинхронности:
from time import time, sleep
from operator import attrgetter

class Article:

    def __init__(self, timestamp, text):
        self.timestamp, self.text = timestamp, text

    def post(self):
        print(f"planned={self.timestamp:.0f}, posted={time():.0f}, text={self.text}")

class Scheduler:
    
    def __init__(self, *articles):
        self.articles = sorted(articles, key=attrgetter("timestamp"))

    def execute(self):
        for article in self.articles:
            sleep(max(article.timestamp - time(), 0))
            article.post()

if __name__ == "__main__":

    now = time()

    Scheduler(
        Article(now + 7, "post3"),
        Article(now + 2, "post1"),
        Article(now + 3, "post2"),
    ).execute()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
1. вычисляем оставшееся время для всех постов
2. находим минимальное
3. time.sleep( то что вычислили в п. 2 )
4. print ...
5. вернуться к п. 1

Так же он не может вывести список того, что уже просрочено
Что вы вообще хотите сделать?

Вопрос из заголовка совсем странный. Работает он потому, что может. Синтаксических ошибок нет, по логике тоже все ок, а на плохой стиль компилятор не ругается. Возможно линтер какой-нибудь ругнется, но его же специально об этом попросить нужно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы