我有一本字典,可能有也可能没有'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)中这样做的惯用方法是什么?
答案 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属性也是完美的