Python:检查密钥是否是字典的一部分

时间:2017-06-08 09:56:35

标签: python dictionary

我正在尝试用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?

6 个答案:

答案 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')

EAFP

  

比获得许可更容易请求宽恕。这个常见的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)

我建议您在编码时将键盘语言切换为英语,以避免这类意外的代码行为。