关于python:当list.dict中没有re.search项时,如何抛出异常

How to throw exception when re.search item is not present in list or dict

我在读一个文件,把内容放进字典里。我正在编写一个方法,在其中搜索键并返回其值。如果我的密钥不在字典中,如何抛出异常。例如,下面是我正在测试的代码,但对于不匹配的项,我得到了re.search的输出,结果显示为none。我可以使用has_key()方法吗?

1
2
3
4
5
6
7
mylist = {'fruit':'apple','vegi':'carrot'}
for key,value in mylist.items():
    found = re.search('vegi',key)
    if found is None:
       print("Not found")
       else:
       print("Found")

发现找不到


python倾向于"请求宽恕比许可更容易"的模式,而不是"先看后跳"。因此,在代码中,在尝试提取关键值之前不要搜索它,只需提取关键值并根据需要(以及在需要时)处理影响。

*假设您询问如何找到一个键,并返回它的值。

EAFP方法:

1
2
3
def some_func(key)
    my_dict = {'fruit':'apple', 'vegi':'carrot'}
    return my_dict[key]   # Raises KeyError if key is not in my_dict

如果您必须执行lbyp,请尝试以下操作:

1
2
3
4
5
6
def some_func(key):
    my_dict = {'fruit':'apple', 'vegi':'carrot'}
    if not key in my_dict:
        raise SomeException('my useful exceptions message')
    else:
        return my_dict[key]

lbyp方法最大的问题是它引入了一个竞争条件;在检查它之间可能存在"key",也可能不存在,然后返回它的值(只有在进行当前工作时才可能存在)。


@Jrazor为您提供了几种使用列表理解、lambda和filter来执行您所称的"has_key()方法"的方法(不过,当我将它们复制/粘贴到python 2.7解释器时,会得到SyntaxError)。

下面是您问题的字面答案:"如果我的密钥不在字典中,如何抛出异常?"

许多语言称为EDOCX1(异常),python称EDOCX1(异常)。更多信息请点击这里。

在您的案例中,您可以添加一个自定义异常,如下所示:

1
2
3
4
5
6
mylist = {'fruit':'apple','vegi':'carrot'} # mylist is a dictionary. Just sayin'

if"key" not in mylist:
    raise Exception("Key not found")
else:
    print"Key found"


您只需使用"in"。

1
2
3
4
5
6
7
8
9
10
11
12
13
mylist = {'fruit':'apple','vegi':'carrot'}

test = ['fruit', 'vegi', 'veg']
for value in test:
    if value in mylist:
        print(value + ' is in the dict, its value : ' + mylist[value])
    else:
        raise Exception(value + ' not in dict.')

# Console
# fruit is in the dict, its value: apple
# vegi is in the dict, its value: carrot
# Exception: veg is not in dict