Просмотр полной версии : Как сделать аргумент в операторе match, case | aiogram
shawtyglock.
13.06.2023, 20:52
В общем-то зарегестрировал допустим несколько команд и перебираю на какой что отвечать боту с помощью оператора match, case, пример:
Python:
match message
.
text
:
case
'start'
:
await
message
.
answer
(
'Приветики'
)
case
'id'
# действия, но здесь оно получается примет только /id, а /id 31232 нет
а в одном нужно вводить аргумент, например /id 123, по сути здесь наверное и нужны регулярки но я вообще не врубаюсь как их сюда подключить
CastelloFAM
13.06.2023, 21:20
В общем-то зарегестрировал допустим несколько команд и перебираю на какой что отвечать боту с помощью оператора match, case, пример:
Python:
match message
.
text
:
case
'start'
:
await
message
.
answer
(
'Приветики'
)
case
'id'
# действия, но здесь оно получается примет только /id, а /id 31232 нет
а в одном нужно вводить аргумент, например /id 123, по сути здесь наверное и нужны регулярки но я вообще не врубаюсь как их сюда подключить
import re
match message.text:
case 'start':
await message.answer('Приветики')
case re.match(r'^id \d+$', message.text):
argument = message.text.split()[1] # Извлекаем аргумент после "id"
await message.answer(f'Вы ввели аргумент: {argument}')
case _:
await message.answer('Неизвестная команда')
shawtyglock.
13.06.2023, 21:51
import re
match message.text:
case 'start':
await message.answer('Приветики')
case re.match(r'^id \d+$', message.text):
argument = message.text.split()[1] # Извлекаем аргумент после "id"
await message.answer(f'Вы ввели аргумент: {argument}')
case _:
await message.answer('Неизвестная команда')
выводит этo:
https://forum.antichat.xyz/attachments/28325838/img_697f0b3a3f.png
AugustTN
13.06.2023, 22:11
Мне кажется это овер мозгоеб, почему не юзать дефолт способ?
И в аиограме вроде как существует message.text.arguments(не помню как, но в документации найдешь)
Python:
import
re
text
=
'/id 1'
commandData
=
re
.
search
(
'^/(\w+)(\s+(.+))?$'
,
text
)
if
commandData
:
command
,
arg
=
commandData
.
group
(
0
,
2
)
match command
:
case
'start'
:
print
(
'питон говно'
)
case
'id'
:
print
(
f'Питон говно, кста ты ввел{arg}'
if
arg
else
'Слышь, кретин, тебе же сказали ввести число после команды. Ну почему я работаю с идиотами...'
)
В общем-то зарегестрировал допустим несколько команд и перебираю на какой что отвечать боту с помощью оператора match, case, пример:
Python:
match message
.
text
:
case
'start'
:
await
message
.
answer
(
'Приветики'
)
case
'id'
# действия, но здесь оно получается примет только /id, а /id 31232 нет
а в одном нужно вводить аргумент, например /id 123, по сути здесь наверное и нужны регулярки но я вообще не врубаюсь как их сюда подключить
1:
import
re
message_text
=
message
.
text
if
re
.
match
(
r'^/start$'
,
message_text
)
:
await
message
.
answer
(
'Приветики'
)
elif
re
.
match
(
r'^/id(?:\s+\d+)?$'
,
message_text
)
:
id_number
=
re
.
search
(
r'\d+'
,
message_text
)
if
id_number
:
id_number
=
int
(
id_number
.
group
(
)
)
# здесь выполняйте действия с id_number
else
:
# здесь выполняйте действия, если нет аргумента после /id
else
:
# здесь обрабатывайте сообщения, которые не соответствуют ни одному из регулярных выражений
самый лучший вариант использовать отдельные хэндлеры, а не строить конструкции в одном
пример для второй версии https://github.com/aiogram/aiogram/tree/dev-2.x#poll-botapi-for-updates-and-process-updates
Python_newbie
14.06.2023, 13:36
Можно без использования regex:
1:
message
=
message
.
text
.
split
(
' '
)
# split по пробелу
match message
:
case
[
'start'
]
:
await
message
.
answer
(
'Приветики'
)
case
'id'
,
id_number
if
id_number
.
isdigit
(
)
:
# code
.
.
.
Не надо так делать
Каждая команда - свой хендлер
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot