Как заставить Python принимать несколько слов в качестве параметров? - PullRequest
0 голосов
/ 08 апреля 2020

Это именно то приложение, которое я пытаюсь заставить работать: я пытаюсь разрешить пользователю вводить несколько слов для параметра 'status'.

т.е.! Setstatus играет в League of Legends

отображает «Playing League» вместо всей строки. Я понимаю, почему, но как мне отформатировать параметры, чтобы принять несколько слов в качестве параметра? Могу ли я это сделать?

@bot.command() 
@commands.has_role('Bot Boss')
async def setstatus(ctx, action, status, url = None): 

    accepted_actions = ['playing', 'streaming', 'listening', 'watching']

    if action.lower() not in accepted_actions:
        await ctx.send("First parameter must be 'playing', 'streaming', 'listening', or 'watching'.")



    if action.lower() == 'playing':
        await bot.change_presence(activity = discord.Game(name = status))

    if action.lower() == 'streaming':
        await bot.change_presence(activity = discord.Streaming(name = status, url = url))

    if action.lower() == 'listening':
        await bot.change_presence(activity = discord.Activity(type=discord.ActivityType.listening, name=status))

    if action.lower() == 'watching':
        await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=status))

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Это не имеет ничего общего с Python, оно связано только с библиотекой бот-дисков Discord.

Соответственно, проверка документации для discord.py предоставляет три метода:

Чтобы использовать слово с пробелами между ними, вы должны заключить его в кавычки:

или

Иногда вы хотите, чтобы пользователи передавали в неопределенном количестве параметров. Библиотека поддерживает это подобно тому, как параметры списка переменных выполняются в Python:

@bot.command()
async def test(ctx, *args):
    await ctx.send('{} arguments: {}'.format(len(args), ', '.join(args)))

Это позволяет нашему пользователю принимать либо один, либо несколько аргументов по своему усмотрению. Это работает аналогично позиционным аргументам, поэтому параметры из нескольких слов должны быть заключены в кавычки.

или

Когда вы хотите обрабатывать анализ аргумента самостоятельно или не хотите Если вы хотите заключить пользовательский ввод из нескольких слов в кавычки, вы можете попросить библиотеку дать вам остальное как один аргумент. Мы делаем это, используя аргумент только для ключевого слова, показанный ниже:

@bot.command()
async def test(ctx, *, arg):
   await ctx.send(arg)
0 голосов
/ 08 апреля 2020

Думаю, вам стоит взглянуть на ArgParse, стандартную библиотеку Python, которая анализирует аргументы.

import argparse
if __name__ == "__main__":     
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('command')
    parser.add_argument('multi_word')
    parser.add_argument('something_else')

    args = parser.parse_args()

    print(args.command)
    print(args.multi_word)
    print(args.something_else)

Вывод:

> python test.py playing "Counterstrike: Global Offensive" another
playing
Counterstrike: Global Offensive
another

Вместо печати вы вызываете свою функцию.

Редактировать: Извините, я не видел, что вы пытаетесь использовать Discord.

...