2017-05-26 47 views
0
@Ava.command() 
async def general(*args): 
    await Ava.send_message(message.Object(id='207602020968955906'), args) 

@Ava.command(aliases=['game']) 
async def setgame(*args): 
    await Ava.change_presence(game=discord.Game(name='%s'% (args))) 

我還是相當新的Python的編碼和使用API​​,但我似乎無法得到這個工作。*參數表是給我未知的故障

此代碼應該接受用戶輸入(在命令之後)並在其他地方(在給定ID的目的地)重新打印它。但是,在接受用戶輸入時,似乎會附上一些奇怪的標點符號。

'嗨'變成('嗨',)例如。它始終是相同的標點符號。正如你上面看到的,我嘗試了兩種拉動參數的方法。我已經找遍了,找不到這個答案 - 任何想法爲什麼*參數是這樣工作/如何解決它?

感謝任何幫助!

+2

'args'是一個元組。 '('Hi',)'是那個元組,裏面有一個元素。它*具有*作爲元組,因爲'* args'意味着你將捕獲0個或更多的參數。 –

+0

你爲什麼使用'* args'呢? –

+0

不要混淆元組'args'的字符串表示與實際數據。它只添加了額外的字符來表示類型,就像引號出現在「Hi」的周圍一樣,它們不是存儲數據的一部分。 – cdarke

回答

0

*args捕獲0或多個參數,並存儲那些元組。當你的函數調用一個參數,你會得到一個元組與一個元素:

>>> def foo(*args): 
...  print(args) 
... 
>>> foo('Hi') 
('Hi',) 

你是一個元組轉換爲字符串,這樣做,你包括整個元組符號。也許你可以將加入將字符串合併爲一個更長的字符串,兩者之間有空格?

像這樣:

name = ' '.join(args) 
await Ava.change_presence(game=discord.Game(name=name)) 

這並假定所有函數的自變量總是將是字符串。

+0

非常感謝您的快速響應 - 我意識到我是個白癡,並沒有正確使用*參數。作爲一個簡短的第二個問題,我想 - 我將如何去允許一個帶空格的字符串被計數?使用sampleString而不是* args,它只接受字符串中的第一個單詞。 –

+0

@KitSmith:聽起來像'Ava'爲你分割命令並將結果單詞作爲單獨的參數傳遞。我不熟悉Ava,看看他們的文檔? –

+0

@KitSmith:google搜索,我沒有看到任何與'discord' Python API相關的'Ava'類,所以我猜這是你自己代碼中的一個名字。但是,你需要看看你的庫文檔,無論是負責實現'.command()'裝飾器。 –

0

即只是如何長度爲1的tuples被表示:

>>> ('Hi', 'Bye')[:1] 
('Hi',) 
0

嘗試使用*args

例如路過的說法,你的情況

await Ava.send_message(message.Object(id='207602020968955906'), *args)