我正在尝试用Python创建自己的irc bot(用于抽搐)。我的命令有一本字典:
commands = {
'!ping': {
'cooldown': 30,
'return': '!pong'
},
'!random': {
'cooldown': 30,
'return': 'command',
'argc': 2,
'arg_username': True,
'usage': '!random <min> <max>'
}
} # End of commands
然后我有一个函数来检查发送的消息是否确实是一个命令:
import string
def is_valid_command(command):
return True if command in commands.keys() else False
所以当我测试这个功能时,它似乎不起作用,我不知道我的错误是什么:
message = "!ping"
print(str(is_valid_command(message)))
>>> False
我试图将字典中的'!ping'改为“!ping”,反之亦然,甚至删除了'!'它总是说它是假的。
谢谢, Laurens的
编辑:
def is_valid_command(command):
for key in commands.keys():
print(key)
print("input " + str(command))
print(command in commands.keys())
return command in commands.keys()
结果如下:
!ping
!random
input !ping
False
EDIT2:@ e4c5希望我使用try / except,因为我很快就尝试了(在那个方法中),它仍然返回False
try:
cmd = commands[command]
print ('Try True')
return True
except KeyError:
print('Try False')
return False
EDIT3:u'!ping'在修复之前(message = u'!ping'),但是当我从其他地方读取一个字符串时,是否有一个函数可以实现这种unicoding?
答案 0 :(得分:6)
您的is_valid_command
功能可以简化为:
def is_valid_command(command):
return command in commands
答案 1 :(得分:2)
我刚刚测试了你的脚本,它似乎工作正常。
做了一些简化,但基本上和你有相同的代码。
commands = {
'!ping': {
'cooldown': 30,
'return': '!pong'
},
'!random': {
'cooldown': 30,
'return': 'command',
'argc': 2,
'arg_username': True,
'usage': '!random <min> <max>'
}
}
def is_valid_command(command):
return command in commands.keys()
print(is_valid_command("!ping"))
返回True
。如果我尝试命令!pong
,则返回False
。
答案 2 :(得分:1)
不需要这种预先检查和unpythonic。而不是所有这些复杂功能,只需做
try:
cmd = commands[message]
# do whatever with cmd
except KeyError:
print ('Sorry not a valid command')
比获得许可更容易请求宽恕。这个常见的Python 编码风格假定存在有效的键或属性 如果假设被证明是假的,则捕获异常。这干净又快 风格的特点是存在许多尝试和除外 声明。该技术与许多人共同的LBYL风格形成鲜明对比 其他语言,如C.
答案 3 :(得分:1)
你为什么不回来:
return command in commands.keys()
那应该是真/假!希望这澄清!
如上所述,只需在消息中创建一个unicode字符串:
u'%s' % message
答案 4 :(得分:0)
我正在使用python2.7,你的代码为我返回True。
您可以直接使用:
而不是编写功能 message = "!ping"
print(commands.has_key(message))
答案 5 :(得分:0)
是的,有一个函数可以将字符串转换为unicode。使用unicode
功能,例如unicode('my_string')
。
例如,如果您来自irc的邮件存储在变量message_from_irc
中,那么您可以将其转换为unicode(message_from_irc)
。
我建议您在编码时将键盘语言切换为英语,以避免这类意外的代码行为。