Можно ли в название команды(или функции) поместить переменную?

Недавно начал изучать создание ботов для discord'a на python и встретил интересный пример, который пока не понимаю, как можно реализовать: DnD бот, который может получить команду вида {prefix}r{d1}d{d2}, например: !r2d20 - 2 раза генерирует случайное число от 1 до 20. То есть первое число (d1) отвечает за кол-во генераций, а d2 за максимальное число. Ввести можно любое число, но диапазон d1 - от 1 до 25 (при попытке ввести больше извещает о предельном числе).

Я понимаю, что можно реализовать проще (например: !r 2 20), но стало интересно, как именно был реализован данный пример.


Ответы (1 шт):

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

С помощью регулярных выражений:

import re

command = "!r2d20"

result = re.search(r"(.)r(\d+)d(\d+)", command)
# Вкратце: точка - любой символ, \d - число, + - встречается 1 или более раз,
# скобки обозначают искомые группы символов

print(result.groups())  # ('!', '2', '20')

# Все найденные группы (соответствующие скобкам в шаблоне) распаковываем в отдельные переменные:
prefix, d1, d2 = result.groups()  

print(prefix)
print(d1)
print(d2)

# Найденные группы - это строки, поэтому для сравнения с числами их нужно преобразовывать в int
if not (1 <= int(d1) <= 25):
    print("Число не входит в диапазон")

С помощью модуля parse:

from parse import parse

command = "!r2d20"

result = parse("{}r{:d}d{:d}", command)
print(result)  # <Result ('!', 2, 20) {}>
prefix, d1, d2 = result

print(prefix)  # !
print(d1)  # 2
print(d2)  # 20
# Здесь d1 и d2 уже целые числа, т.к. {:d} в шаблоне поиска указывает,
# что нужно преобразовать эти части строки в числа
→ Ссылка