Тема: if else | datetime | pyrogram
Вітаю
Виникла думка "А чи не можна якось скоротити цей кусочок кода"
Думка то виникла а от ідеї які були придумані щоб це реалізовати були погані
Як на вашу думку це можливо зробити? Якщо так, то буду далі думати
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Python → if else | datetime | pyrogram
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Вітаю
Виникла думка "А чи не можна якось скоротити цей кусочок кода"
Думка то виникла а от ідеї які були придумані щоб це реалізовати були погані
Як на вашу думку це можливо зробити? Якщо так, то буду далі думати
це я сліпий, чи цей код таки ідентичний?
if houre == 0 and minute == 0:
bot.send_message(chat_id, 'букави')
elif houre == 0 and minute == 0:
bot.send_message(chat_id, 'букави')
elif houre == 0 and minute == 0:
bot.send_message(chat_id, 'букави')
це я сліпий, чи цей код таки ідентичний?
if houre == 0 and minute == 0: bot.send_message(chat_id, 'букави') elif houre == 0 and minute == 0: bot.send_message(chat_id, 'букави') elif houre == 0 and minute == 0: bot.send_message(chat_id, 'букави')
там у всіх днях різні назви предметів і силки це я так, для прикладу
FakiNyan написав:це я сліпий, чи цей код таки ідентичний?
if houre == 0 and minute == 0: bot.send_message(chat_id, 'букави') elif houre == 0 and minute == 0: bot.send_message(chat_id, 'букави') elif houre == 0 and minute == 0: bot.send_message(chat_id, 'букави')
там у всіх днях різні назви предметів і силки це я так, для прикладу
то напишіть нормально
Ну, для початку - такий код має викликатися cron-ом, а не висіти в пам'яті.
Далі - "магічні значення" та повторення в коді є злом. Тут повторюється один і той самий фрагмент, залежний від констант - значить, їх можна зібрати в масив чи словник:
SCHEDULE = {0:[(11,40,'інформатика',l.inf),
(13,30,'інформатика',l.inf)
],
1:[(11,40,'фізіологія',''),
(13,30,'щось ще','\nSkype')
],
...}
...
for sched_hour, sched_min, sched_name, sched_suffix in SCHEDULE[day]:
alarm_min = sched_min-2
if alarm_min<0:
alarm_min += 60
alarm_hour -= 1
if hour==alarm_hour and minute==alarm_min:
end_hour = sched_hour+1
end_min = sched_min + 20
if end_min>=60:
end_min -= 60
end_hour += 1
app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min}){sched_suffix}')
break
Виникли нові "магічні числа" і багато однотипних операцій з часом, прибираємо:
SCHEDULE = [
[(11,40,'інформатика',l.inf),
(13,30,'інформатика',l.inf)
],
[(11,40,'фізіологія',''),
(13,30,'щось ще','\nSkype')
],
...]
HOURS_IN_DAY = 24
MINUTES_IN_HOUR = 60
MINUTES_BEFORE_ALARM = 2
CLASS_DURATION = 80
def add_time(h, m, dm):
m += dm
while m < 0:
m += MINUTES_IN_HOUR
h -= 1
while m >= MINUTES_IN_HOUR:
m -= MINUTES_IN_HOUR
h += 1
h %= HOURS_IN_DAY
return (h,m)
...
for sched_hour, sched_min, sched_name, sched_suffix in SCHEDULE[day]:
if (hour, minute)==add_time(sched_hour, sched_min, - MINUTES_BEFORE_ALARM):
end_hour, end_min = add_time(sched_time, CLASS_DURATION)
app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min}){sched_suffix}')
break
Хоча взагалі треба переробляти час на стандартні часові типи.
Також можна кожен рядок в розкладі переробити на окремий об'єкт, що вміє повертати час та опис як str, але то вже на свій смак. І взагалі треба таку табличку з бази викачувати, а не хардкодити.
Ще трохи функцію підправлю:
def add_time(h, m, dm):
dh, m = divmod(m+dm, MINUTES_IN_HOUR)
return ((h+dh)%HOURS_IN_DAY, m)
А ще можна переробити списки в днях на словники за часом, тоді й цикл не потрібен:
SCHEDULE = [
{(11,40):('інформатика',l.inf),
(13,30):('інформатика',l.inf)
},
{(11,40):('фізіологія',''),
(13,30):('щось ще','\nSkype')
},
...]
HOURS_IN_DAY = 24
MINUTES_IN_HOUR = 60
MINUTES_BEFORE_ALARM = 2
CLASS_DURATION = 80
def add_time(h, m, dm):
dh, m = divmod(m+dm, MINUTES_IN_HOUR)
return ((h+dh)%HOURS_IN_DAY, m)
...
time_to_alarm = add_time(hour, min, MINUTES_BEFORE_ALARM)
if time_to_alarm in SCHEDULE[day]:
sched_name, sched_suffix = SCHEDULE[day][time_to_alarm]:
end_hour, end_min = add_time(time_to_alarm[0], time_to_alarm[1], CLASS_DURATION)
app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min}){sched_suffix}')
Дякую.
Кому цікаво, ось фінальний результат
Додаткова проблема: time.sleep гарантує лише, що пауза буде не меншою за вказану. Тобто є імовірність пропустити подію. Треба показувати повідомлення для всіх подій, що вже настали, і видаляти їх (або позначати виконаними).
Додаткова проблема: time.sleep гарантує лише, що пауза буде не меншою за вказану. Тобто є імовірність пропустити подію. Треба показувати повідомлення для всіх подій, що вже настали, і видаляти їх (або позначати виконаними).
та я з цею паузою уже з лютого живу і ще ніразу не пропустилось :D
та я з цею паузою уже з лютого живу і ще ніразу не пропустилось
Імовірність насправді досить мала. Але не нульова.
А де ви це запускаєте? Які ОС, ваші права на машині?
mamkin haker написав:та я з цею паузою уже з лютого живу і ще ніразу не пропустилось
Імовірність насправді досить мала. Але не нульова.
А де ви це запускаєте? Які ОС, ваші права на машині?
У себе на ПК.
ОС linux mint 20.1
man cron
German (detected)
людина крон?
Ви хочете сказати, що маєте лінукс на комп'ютері і не знаєте консольної команди man?
Ви хочете сказати, що маєте лінукс на комп'ютері і не знаєте консольної команди man?
та я з windows 10 тільки недавно пішов, цікава команда, потім почитаю
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися