在 python dict.get() 中引发异常
Raise exception in python dict.get()
实际上,我已经知道我想做的事情有点奇怪,但我认为它很适合我的代码,所以我问:
有没有办法做这样的事情:
foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }
foo.get('h', bar.get('h'))
引发异常而不是 None
,以防 dict.get() 'fails'?
foo.get('h', bar.get('h', raise))
将提高 SyntaxError
foo.get('h', bar.get('h', Exception))
只会 return Exception
现在我只是在使用 if not foo.get('h', bar.get('h')): raise Exception
,但如果有办法直接在 dict.get()
中加注,我会很高兴。
谢谢
你可以这样做:
class MyException(Exception):
pass
try:
value = dict['h']
except KeyError:
raise MyException('my message')
使用下标,这是默认行为:
d={}
d['unknown key'] --> Raises a KeyError
如果你想抛出一个自定义异常,你可以这样做:
try:
d['unknown key']
except KeyError:
raise CustomException('Custom message')
并包含来自 KeyError 的堆栈跟踪:
try:
d['unknown key']
except KeyError as e:
raise CustomException('Custom message') from e
您可以使用魔法函数为您的字典做自定义 class :
class GetAndRaise:
def __init__(self):
self.dict = dict()
def __getitem__(self, key):
try:
return self.dict[key]
except ValueError:
raise MyException
def __setitem__(self, key, value):
self.dict[key] = value
def get(self, key):
return self[key]
既然您已经有了一些很好的答案,我将给您 boondoggle 答案作为学习...的东西。
class MyDict(dict):
def get(self, key, default=None, error=None):
res = super().get(key,default)
if res is None:
if error == 'raise':
raise SyntaxError()
elif error == 'Exception':
return SyntaxError()
return res
现在你可以做 :
foo = MyDict({ 'a':1, 'b':2, 'c':3 })
bar = MyDict({ 'd':4, 'f':5, 'g':6 })
foo.get('h', bar.get('h', error="Exception")) # returns a syntaxerror object
foo.get('h', bar.get('h', error="raise")) # raises a syntax error
super()
允许您访问超类的成员,这样您就可以拥有自己的 get
,同时仍在内部使用父类 get
可以使用容器ChainMap
,将两个字典封装为一个:
from collections import ChainMap
foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }
ChainMap(foo, bar)['h']
如果你想在 get 中引发错误,那么你可以这样欺骗:
{"a":4}.get("b", exec("raise Exception('some error msg') "))
此外,如果您想避免拼写错误,请使用 f-strings。
你可以做一些断言魔术:
foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }
assert foo.get('h', bar.get('h')), 'value "h" did not exist in dicts!'
Foo 尝试选择键“h”的值并回退到 bar 选择键“h”的值,如果这些值return 没有任何意义,最里面的 get 调用的默认值是 returned,在本例中为 None。 None 导致断言触发。
这是可行的,因为任何对象都可以测试真值,比如 None. 等常量
https://docs.python.org/3/library/stdtypes.html#truth-value-testing
您还可以获得自定义错误消息的额外好处。
对于 Python 3.8 + 你可以将它与一些海象魔法结合起来:
assert (myVariable := foo.get('h', bar.get('h'))), 'value "h" did not exist in dicts!'
# if value of key "h" was found from any of the dicts, it is now assigned to the variable myVariable.
实际上,我已经知道我想做的事情有点奇怪,但我认为它很适合我的代码,所以我问:
有没有办法做这样的事情:
foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }
foo.get('h', bar.get('h'))
引发异常而不是 None
,以防 dict.get() 'fails'?
foo.get('h', bar.get('h', raise))
将提高 SyntaxError
foo.get('h', bar.get('h', Exception))
只会 return Exception
现在我只是在使用 if not foo.get('h', bar.get('h')): raise Exception
,但如果有办法直接在 dict.get()
中加注,我会很高兴。
谢谢
你可以这样做:
class MyException(Exception):
pass
try:
value = dict['h']
except KeyError:
raise MyException('my message')
使用下标,这是默认行为:
d={}
d['unknown key'] --> Raises a KeyError
如果你想抛出一个自定义异常,你可以这样做:
try:
d['unknown key']
except KeyError:
raise CustomException('Custom message')
并包含来自 KeyError 的堆栈跟踪:
try:
d['unknown key']
except KeyError as e:
raise CustomException('Custom message') from e
您可以使用魔法函数为您的字典做自定义 class :
class GetAndRaise:
def __init__(self):
self.dict = dict()
def __getitem__(self, key):
try:
return self.dict[key]
except ValueError:
raise MyException
def __setitem__(self, key, value):
self.dict[key] = value
def get(self, key):
return self[key]
既然您已经有了一些很好的答案,我将给您 boondoggle 答案作为学习...的东西。
class MyDict(dict):
def get(self, key, default=None, error=None):
res = super().get(key,default)
if res is None:
if error == 'raise':
raise SyntaxError()
elif error == 'Exception':
return SyntaxError()
return res
现在你可以做 :
foo = MyDict({ 'a':1, 'b':2, 'c':3 })
bar = MyDict({ 'd':4, 'f':5, 'g':6 })
foo.get('h', bar.get('h', error="Exception")) # returns a syntaxerror object
foo.get('h', bar.get('h', error="raise")) # raises a syntax error
super()
允许您访问超类的成员,这样您就可以拥有自己的 get
,同时仍在内部使用父类 get
可以使用容器ChainMap
,将两个字典封装为一个:
from collections import ChainMap
foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }
ChainMap(foo, bar)['h']
如果你想在 get 中引发错误,那么你可以这样欺骗:
{"a":4}.get("b", exec("raise Exception('some error msg') "))
此外,如果您想避免拼写错误,请使用 f-strings。
你可以做一些断言魔术:
foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }
assert foo.get('h', bar.get('h')), 'value "h" did not exist in dicts!'
Foo 尝试选择键“h”的值并回退到 bar 选择键“h”的值,如果这些值return 没有任何意义,最里面的 get 调用的默认值是 returned,在本例中为 None。 None 导致断言触发。
这是可行的,因为任何对象都可以测试真值,比如 None. 等常量 https://docs.python.org/3/library/stdtypes.html#truth-value-testing
您还可以获得自定义错误消息的额外好处。
对于 Python 3.8 + 你可以将它与一些海象魔法结合起来:
assert (myVariable := foo.get('h', bar.get('h'))), 'value "h" did not exist in dicts!'
# if value of key "h" was found from any of the dicts, it is now assigned to the variable myVariable.