Можно ли в название команды(или функции) поместить переменную?
Недавно начал изучать создание ботов для 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} в шаблоне поиска указывает,
# что нужно преобразовать эти части строки в числа