Python字典值检查不为空而不是None

时间:2017-09-19 16:44:24

标签: python python-2.7

我有一本字典,可能有也可能没有'foo'和'bar'中的一个或两个键。根据两者是否可用,我需要做不同的事情。这就是我正在做的事情(并且它有效):

foo = None
bar = None

if 'foo' in data:
    if data['foo']:
        foo = data['foo']

if 'bar' in data:
    if data['bar']:
        bar = data['bar']

if foo is not None and bar is not None:
    dofoobar()
elif foo is not None:
    dofoo()
elif bar is not None:
    dobar()

这看起来太冗长了 - 在Python(2.7.10)中这样做的惯用方法是什么?

4 个答案:

答案 0 :(得分:5)

您可以使用dict.get()缩短代码。当密钥不存在时,不是提出KeyError,而是返回None

foo = data.get('foo')
bar = data.get('email')

if foo is not None and bar is not None:
    dofoobar()
elif foo is not None:
    dofoo()
elif bar is not None:
    dobar()

答案 1 :(得分:3)

以下是重构代码的另一种方法:

foo = data.get('foo')
bar = data.get('bar')

if foo:
    if bar:
        dofoobar()
    else:
        dofoo()
elif bar:
    dobar()

我不确定它比ChristianDean的答案更清晰或更易读。

为了好玩,你也可以使用带有布尔元组的dict作为键和函数作为值:

{(True, True):dofoobar, (False, True):dobar, (True, False):dofoo}

您可以这样使用它:

data = {'foo': 'something'}

foo = data.get('foo')
bar = data.get('bar')

def dofoobar():
    print('foobar!')

def dobar():
    print('bar!')

def dofoo():
    print('foo!')

actions = {(True, True):dofoobar, (False, True):dobar, (True, False):dofoo}
action = actions.get((foo is not None, bar is not None))
if action:
    action()
#foo!

答案 2 :(得分:0)

>>> data = {'foo': 1}
>>> foo = data.get('foo')
>>> foo
1
>>> bar = data.get('bar')
>>> bar
>>> bar is None
True

答案 3 :(得分:-1)

someConstraint.constant = 100; // the change

// Animate just to make sure the constraint change is fully applied
[UIView animateWithDuration:0.1f animations:^{
    [self.view setNeedsLayout];
} completion:^(BOOL finished) {
    // Here do whatever you need to do after constraint change
}];

你可以使用try / except.Also get属性也是完美的