Как вызвать в функции случайную функцию?

Хочу вывести на печать случайным образом содержимое в функции.. получаю сообщение:

<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 шт):

Автор решения: insolor

Будем исправлять поэтапно.

Для начала, у вас есть вложенная функция 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)
→ Ссылка