# словарь, где ключ - строка с названием пунка отправления, а значение - ещё словарь,
# где ключ - строка с названием пункта назначения, а значение - список,
# где элементы - пары строк ("время отправления", "время прибытия")
# Тогда с таким словарём можно будет работать так:
bus_timetable: dict[str, dict[str, list[tuple[str, str]]]] = {
# ты словарь заполняешь по результатам парсинга, ну и то хорошо
# я для примера запишу прямо так
'Владимир' : {
'Муром': [
('8:00', '11:00'),
('9:00', '12:00'),
('10:00', '13:00'),
],
},
}
point_from = 'Владимир'
point_to = 'Муром'
# для примера вывожу в консоль, для бота перепишешь сам
print(f'Автобус из {point_from} в {point_to}')
for departure, arrival in bus_timetable[point_from][point_to]:
print(f'Отходит в {departure}, прибывает в {arrival}')
kbd_from = types.ReplyKeyboardMarkup(resize_keyboard=True)
buttons = [types.KeyboardButton(point_from) for point_from in bus_timetable] # список кнопок
kbd_from.add(*buttons) # если надо добавить все кнопки сразу
@bot.message_handler(content_types=['text'])
def first_message_handler(message):
if message.text in bus_timetable: # назвали известный город? Это пункт отправления
kbd = ... # тут определяешь клавиатуру, опираясь на города в bus_timetable[message.text]
response = bot.reply_to(message, "А теперь назовите пункт назначения", reply_markup=kbd)
# обрати внимание: все параметры после указания функции second_message_handler будут
# переданы в эту функцию при её вызове. А вызвана она будет, когда пользователь ответит.
bot.register_next_step_handler(response, second_message_handler, message.text)
elif ... # нам назвали не город - тут можно проверить другие команды
def second_message_handler(message, point_from):
# а эта функция будет вызвана только когда пользователь уже назвал пункт отправления
# point_from будет содержать название города, отправленное пользователем.
if message.text in bus_timetable[point_from]: # нам назвали допустимый пункт назначения
bus_rides = bus_timetable[point_from][message.text] # список рейсов
... # дальше перебираем список bus_rides и выводим его пользователю
else: # пользователь назвал что-то другое
... # говорим пользователю, что он дурак
RuntimeError: This Application was not initialized via `Application.initialize`!
image = cv2.imread("image.png")
image = image.astype(numpy.uint32) # смена типа нужна, иначе при сдвиге потеряются разряды
image_clone = (image[..., 0] << 16) | (image[..., 1] << 8) | image[..., 2]
image = cv2.imread("image.png")
image_clone = numpy.zeros(image.shape[:2], numpy.uint32)
# краткие формы операций не создают новый массив, а изменяют существующий по месту
image_clone |= image[..., 0]
image_clone <<= 8
image_clone |= image[..., 1]
image_clone <<= 8
image_clone |= image[..., 2]
<body style="height: 100%; width:100%;">
<div id=app style="height: 100%; width:100%;"></div>
<script src=js/chunk-vendors.c1d200da.js></script>
<script src=js/chunk-common.adcda62e.js></script>
<script src=js/chunk-esri.caf28189.js></script>
<script src=js/index.ca134891.js></script>
</body>
nullsbrawl:///createAndJoinRoom?...
.Если из командной строки дать pyhon3 /home/lxm213/script.py, то скрипт работает штатно и без ошибок
pip install schedule
? Из-под рута ставил или с правами просто пользователя?def filter_fields(obj: dict[str, ...], fields: list[str]) -> dict[str, ...]:
"""obj - фильтруемый словарь, fields - множество полей, которые надо оставить."""
...
top_level_fields = {}
for f in fields:
top, _, bottom = f.partition('.')
top_level_fields.setdefault(top, [])
if bottom is not None:
top_level_fields[top].append(bottom)
fields=['boardId', 'name', 'Data.Matches.t.id', 'Data.Matches.m']
в top_level_fields получишь { 'boardId': [], 'name': [], 'Data': ['Matches.t.id', 'Matches.m']}
output = {}
for top, bottom in top_level_fields.items():
if bottom:
output[top] = filter_fields(obj[top], bottom) # что делать, если ключа top нет?
else:
output[top] = obj[top]
# Ты заявляешь следущее:
# "метод udar должен вызываться на экземпляре объекта (self) с двумя параметрами: hp и dmg"
def udar(self,hp,dmg):
print("Наносит урон с руки")
# при этом метод не использует переданные параметры?
rep = self.hp - self.dmg # почему self.dmg? Боец бьёт себя?
return "Осталось здоровья: " + rep
# а ниже у тебя:
# метод udar() фактически вызывается с одним параметром: другим бойцом
boec.udar(boec2)
class Fighter:
def __init__(self, name: str, hp: int, damage: int): # указывай типы параметров - так проще понять, что нужно методу
"""Конструктор инициализирует экземпляр бойца заданными значениями."""
self.name: str = name
self.hp: int = hp
self.damage: int = damage
def is_defeated(self) -> bool:
"""Возвращает True, если боец не может более сражаться."""
return self.hp <= 0 # в простейшем случае, если у бойца не осталось HP
def calculate_attack_on(self, other: 'Fighter') -> int:
"""Метод определяет, сколько урона наш боец (self) нанесёт бойцу other. Возвращает число очков урона."""
# сейчас урон всегда одинаков, но потом тут можно будет прикрутить что-то посложнее
# например, рандомный урон в диапазоне, или бонусы/малусы против конкретных бойцов, или ещё что
return self.damage
def receive_damage(self, damage: int) -> int:
"""Метод определяет, сколько HP наш боец (self) потеряет, получив урон damage, и уменьшает его здоровье. Возвращает число фактически потерянных очков здоровья."""
# сейчас метод просто вычитает урон из очков здоровья.
# но потом при желании можно добавить, например, механику "последний шанс",
# когда первый "смертельный" удар оставляет бойца на 1 хп. Или сопротивление/уязвимость к урону, или ещё что.
lost = min(self.hp, damage) # если у нас 1 очко здоровья, мы не можем потерять 10
self.hp -= lost
return lost
def attack_other(self, target: 'Fighter') -> int:
"""Проводит атаку нашего бойца (self) по другому бойцу (target). Возвращает нанесённый урон."""
attack_damage = self.calculate_attack_on(target)
actual_damage = target.receive_damage(attack_damage)
return actual_damage
boec = Fighter("вася",200,22)
boec2 = Fighter("bob",100,19)
print(f'{boec.name}: {boec.hp} HP; {boec2.name}: {boec2.hp} HP')
dmg = boec.attach_other(boec2)
print(f'{boec.name} нанёс {dmg} урона {boec2.name}')
print(f'{boec.name}: {boec.hp} HP; {boec2.name}: {boec2.hp} HP')
try:
loop.create_task(exc())
except ZeroDivisionError as ex:
print(f"Ошибка {ex} обработана")
task = asyncio.create_task(exc())
try:
# await asyncio.gather(task) # <- gather() не нужно, если у тебя одна задача
await task
except ZeroDivisionError as ex:
print(f"Ошибка {ex} обработана")
data == 'send_purchase'
. На текущем шаге добавь во ВСЕ цепочки if ... elif ... elif ...
ветку else
, которая выводит отладочное сообщение - тогда хоть будет понятно, какой обработчик вызвался и с каким значением.