@bot.message_handler(commands=['start'])
def start(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard= True,)
item1 = types.KeyboardButton('Клик')
markup.add(item1)
bot.send_message(message.chat.id, f'Привет, {message.from_user. first_name}!', reply_markup=markup)
markup = ...
, уже не является частью функции startup(), так как отступ неверный. Учи Питон. locals()[numb + str(bomb_meaning)]
def handle_button(call_data: str):
try:
fileid = int(call_data) - 1 # определяем id файла по значению call_data
except ValueError:
return
markup = InlineKeyboardMarkup()
bttn_contact = (InlineKeyboardButton(text = " Связаться с менеджером", callback_data = "contact"))
markup.add(bttn_contact)
bttn_home = (InlineKeyboardButton(text = " Начало", callback_data = "home"))
markup.add(bttn_home)
with open(f'data/{fileid}_info.txt', 'r', encoding = "utf-8") as file:
content = file.read()
# if тут не нужен, сработает и без него.
for x in range(0, len(content), 4095):
bot.send_message(call.message.chat.id,content[x:x+4095],reply_markup=markup)
handle_button(call.data)
. fathers_number = 5
sons_number = int(input("Какое число я загадал? "))
if sons_number == fathers_number:
print("Угадал!")
else:
print("Не угадал!")
print("Конец игры")
file_writer.writerow([name, subscribers, type, price])
file_writer.writerows(zip(name, subscribers, type, price))
th_bot = Thread(target=pyrobot(), args=())
th_userbot = Thread(target=aiobot(), args=())
asyncio.new_event_loop()
, потом задаёт его как текущий для своего потока через asyncio.set_event_loop(loop)
. Если ботам не требуется взаимодействовать, то это может быть проще. Если требуется... будут проблемы. Два реактора в одной программе - это не хорошо.app.run()
, и вызов executor.start_polling(dp, skip_updates=True)
скорее всего под капотом создают асинхронную функцию (корутину), и запускают её в реакторе. Тогда ты можешь обойтись без потоков, заставив обоих ботов работать на одном реакторе. Нужно будет зарыться в доки, или даже глянуть исходники.When calling this method (app.run()) without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.
async def pyrobot(): # обрати внимание, теперь функция асинхронная!
print("pyro started")
@app.on_message(filters.chat("some_chat"))
async def print_pyrogram():
print("Pyrogram")
# это вместо вызова app.run(), как написано в доках.
await app.start()
try:
await app.idle()
finally:
await app.end()
asyncio.run(asyncio.gather(pyrobot(), aiobot()))
def compose_sum(numbers: list[int], total: int) -> list[int] | None:
# ищем индексы потенциальных слагаемых
indices = [i for i in range(len(numbers)) if numbers[i] <= total]
# сортируем по убыванию слагаемых, потом по порядку в списке
indices.sort(key = lambda i: (numbers[i], i), reverse=True)
# если нулевой элемент совпадает - мы нашли точную сумму. Прерываем рекурсию.
if numbers[indices[0]] == total:
return [indices[0]]
for index in indices: # иначе перебираем слагаемые
numcopy = numbers.copy()
# копия списка без рассматриваемого слагаемого
current = numpcopy.pop(index)
next_indices = compose_sum(numcopy, total - current)
if next_indices: # нашли решение, корректируем индексы (так как мы удалили один элемент)
for i in range(len(next_indices)):
if next_indices[i] >= index:
next_indices[i] += 1
return [index] + next_indices # отдаём наше решение "наверх"
# next_indices пуст/None - решения не нашли, пробуем другой index
return None # не нашли решения ни для одного index
линия и пунктир с треугольной стрелкой самые понятные, они просто наследуют классы
линии с ромбиками понятны отчасти, в свойстве класса создают экземпляр другого класса
visit = random.choice(urls)
urls = [] # в urls пусто
# тут ты только определяешь функцию, но не вызываешь её
def createlist(ids):
global urls
for id in ids:
urls.append("https://scrap.tf/raffles/" + id)
# так что тут urls всё ещё пуст
# внутри login() вызывается rufflejoin(). А urls всё ещё пуст.
login()