在python dict.get()中引发异常

时间:2019-02-21 12:53:29

标签: python dictionary exception-handling

实际上,我已经知道我想做的事情有点奇怪,但是我认为它适合我的代码,所以我问:

有没有办法做这样的事情:

foo = { 'a':1, 'b':2, 'c':3 }
bar = { 'd':4, 'f':5, 'g':6 }

foo.get('h', bar.get('h'))

引发异常而不是None,以防dict.get()'失败'?

foo.get('h', bar.get('h', raise))将引发SyntaxError

foo.get('h', bar.get('h', Exception))只会返回Exception

现在我只是与if not foo.get('h', bar.get('h')): raise Exception合作,但是如果有一种直接在dict.get()进行加注的方法,我将非常高兴。

谢谢

5 个答案:

答案 0 :(得分:4)

使用下标,这是默认行为:

d={}
d['unknown key'] --> Raises a KeyError

如果您随后要引发自定义异常,则可以执行以下操作:

try:
    d['unknown key']
except KeyError:
    raise CustomException('Custom message')

并包含KeyError中的stacktrace:

try:
    d['unknown key']
except KeyError as e:
    raise CustomException('Custom message') from e

答案 1 :(得分:1)

您可以使用容器<Line points={[73, 70, 340, 23, 450, 60, 500, 20]} stroke="black" /> ,该容器将两个字典封装为一个:

ChainMap

答案 2 :(得分:0)

您可以这样做:

class MyException(Exception):
    pass


try:
    value = dict['h']
except KeyError:
    raise MyException('my message')

答案 3 :(得分:0)

您可以使用魔术功能为字典自定义类:

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]

答案 4 :(得分:0)

因为您已经有了一些好的答案,所以我会给您笨拙的答案,作为学习的东西。

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