Как вызвать в функции случайную функцию?
Хочу вывести на печать случайным образом содержимое в функции.. получаю сообщение:
<coroutine object process_start_command.<locals>.x at 0x0000024E0D550240>
программа:
import random
import randomfun
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
async def x():
if True:
f = [randomfun.ran_fun1, randomfun.ran_fun2]
rand_x = random.choice(f)
rand_x()
await message.answer(f"{x}")
файл randomfun:
from aiogram import types
async def ran_fun1(message: types.Message):
await message.answer(text='Это рандомное сообщение 1')
async def ran_fun2(message: types.Message):
await message.answer(text='Это рандомное сообщение 2')
Я конкретно запутался, явно что то не то вызываю.
Ответы (1 шт):
Будем исправлять поэтапно.
Для начала, у вас есть вложенная функция x, но вы ее не вызываете, а выводите как сообщение. Чтобы вызвать функцию, нужно добавить скобки: x()
. Т.к. функция асинхронная, то нужно добавить еще и await
. Если бы функция возвращала текст сообщения, можно было бы написать вот так:
await message.answer(text=f"{await x()}")
или проще:
await message.answer(text=await x())
Т.к. функция у вас ничего не возвращает, а пытается вызвать внутри функцию, которая сама отправляет сообщение, то нужно просто вызвать как await x()
.
Далее, у вас в rand_x
попадает асинхронная функция, ее нужно вызывать как асинхронную функцию (с await
). При этом все функции в списке у вас ожидают параметр message
, его нужно при вызове передать. Итого, вызов случайной функции должен выглядеть так:
await rand_x(message)
Целиком будет что-то такое:
import random
import randomfun
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
async def x():
if True:
f = [randomfun.ran_fun1, randomfun.ran_fun2]
rand_x = random.choice(f)
await rand_x(message)
await x()
Если убрать бессмысленную вложенность функции и бессмысленную проверку на True
, то получится так:
import random
import randomfun
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
f = [randomfun.ran_fun1, randomfun.ran_fun2]
rand_x = random.choice(f)
await rand_x(message)
Если у вас функции ничего кроме вывода сообщений не делают, то проще не список функций хранить, а список сообщений:
import random
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
messages = ['Это рандомное сообщение 1', 'Это рандомное сообщение 2']
random_message = random.choice(f)
await message.answer(text=random_message)