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解释器时,会得到
下面是您问题的字面答案:"如果我的密钥不在字典中,如何抛出异常?"
许多语言称为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 |