2017-05-20 6 views
0

非常に基本的な問題私は確かです、私はボットのステータスを変更するためのステータスコマンドを設定しようとしています。次のコードは動作します:split()with maxsplitの問題

@myBot.event   
async def on_message(message): 
if message.content.startswith('!status'): 
    m = message.content.split(' ') 
    await myBot.change_presence(game=discord.Game(name=m[1])) 

だから、何が本当にここに複雑ません、それは私が!status後に入力するものは何でもボットのステータスを設定します。

を除いたm[1]があるため、最初のスペースの後で停止します。今、split()関数にmaxsplit=1を追加すると、最初の空白の後のすべてをm[1]に取得できます。これは完璧なようですね。たとえば、m[1]にはtestのみが含まれていても、私はちょうど前と同じものを入力したとしましょう。!status test、驚き、それは動作しません。どうして? print(m[1])で見ることができないものがmaxsplit=1と実際に変わるのは何ですか?あなたが最初の空白の後にすべてのものを持っていないmaxplitなし

+0

後続スペース/改行? – user1620443

+0

@ user1620443あなたは精巧にできますか?実際の出力をファイルに書き込もうとしましたが、 'm [1]'の最後に改行も改行もありません。少なくともテキストファイルで見ることができるものはありません... – dnLL

+0

'm = message.content [7:]。strip()'すでに '!status'で始まるメッセージを知っているので –

答えて

1

、そしてm[1]はちょうど第一及び第二の空白(存在する場合)との間にすべてが含まれています。それらが同一であるただ一つの空白で

>>> str1 = '!status test' 
>>> str1.split() 
['!status', 'test'] 

>>> str1.split(maxsplit=1) 
['!status', 'test'] 

しかし、複数のとそうではありません:私はあなたが本当に欲しいもの

>>> str2 = '!status test debug' 
>>> str2.split()   # 3 elements 
['!status', 'test', 'debug'] 

>>> str2.split(maxsplit=1) # 2 elements 
['!status', 'test debug'] 

考える!statusを剥ぎ取ることです。

>>> str1[len('!status '):] # or hardcode the length: `[8:]` 
'test' 

>>> str2[len('!status '):] 
'test debug' 

さらに簡単にstr.partition

>>> str1 = '!status test' 
>>> str2 = '!status test debug' 
>>> str1.partition(' ') 
('!status', ' ', 'test') 
>>> str2.partition(' ') 
('!status', ' ', 'test debug') 

第3要素には常に最初の空白の後にすべてが含まれます。最初の要素があるかどうかを確認することもできます== '!status'

+0

実際には、 'split(maxsplit = 1)'や 'split( '')'を使って完全に動作しますが、 '、' maxsplit = 1) 'm [1]は'!status test'を入力として使用して同じ文字列を返すようです。それについての考え?私の最初の問題は解決されます。 – dnLL

+0

私はおそらくすべてのdownvotesと私が受け取っている閉じる要求を考慮して削除するつもりです。私はまだそれが面白いと思う。 – dnLL

+0

'repr(message.content)'と 'type(message.content)'を表示できますか?私はそれがまた質問をより明瞭にすると思うかもしれないし、多分downvotersのいくつかはdownvoteを逆にするでしょう。 – MSeifert