PDA

Просмотр полной версии : Как сделать аргумент в операторе 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(не помню как, но в документации найдешь)

chapo
13.06.2023, 22:27
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
'Слышь, кретин, тебе же сказали ввести число после команды. Ну почему я работаю с идиотами...'
)

feraza
13.06.2023, 22:33
В общем-то зарегестрировал допустим несколько команд и перебираю на какой что отвечать боту с помощью оператора 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
:
# здесь обрабатывайте сообщения, которые не соответствуют ни одному из регулярных выражений

ukiru
14.06.2023, 13:27
самый лучший вариант использовать отдельные хэндлеры, а не строить конструкции в одном

пример для второй версии 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
.
.
.

st4xX
21.06.2023, 21:23
Не надо так делать

Каждая команда - свой хендлер