Python字典值检查为not empty和not None
我有一本字典,可能有也可能没有一个或两个键“foo”和“bar”。根据两者是否都可用,我需要做不同的事情。以下是我正在做的事情(它是有效的): 这似乎太冗长了-Python(2.7.10)中的惯用方法是什么?您可以使用它来缩短代码。当密钥不存在时,不会引发Python字典值检查为not empty和not None,python,python-2.7,Python,Python 2.7,我有一本字典,可能有也可能没有一个或两个键“foo”和“bar”。根据两者是否都可用,我需要做不同的事情。以下是我正在做的事情(它是有效的): 这似乎太冗长了-Python(2.7.10)中的惯用方法是什么?您可以使用它来缩短代码。当密钥不存在时,不会引发KeyError,而是返回None: foo = data.get('foo') bar = data.get('email') if foo is not None and bar is not None: dofoobar() e
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()
您可以使用try/except.allow get属性也是完美的这里有另一种重构代码的方法:
foo = data.get('foo')
bar = data.get('bar')
if foo:
if bar:
dofoobar()
else:
dofoo()
elif bar:
dobar()
不过,我不确定它是否比克里斯蒂安的答案更清晰或更易读
为了好玩,您还可以使用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!
你可以做
foo=data.get('foo')
@EricDuminil不,dofoobar()
不同于dofoo()
后面跟着dobar()
等等,这是一个带有bar
和email
的打字错误,还是你真的检查了两个不同的键?@EricDuminil是一个打字错误。现在修好了。抱歉。第一个if
子句的惯用替代方法可能是all([foo,bar])
如果重要的是真实性,而不是与None
@LukasGraf进行精确比较,我不太确定:|如果foo和bar都是真实的,那么仅仅做难道不会更快更干净吗?@LukasGraf我不确定这是有意的,但在OP的代码中,所有重要的都是真实性,因为如果数据['foo']
的计算结果不是真的,foo
将永远不会得到除None
@ChristianDean之外的值。这是真的,在功能上应该是等效的,甚至更干净。我认为它不会太快,因为all()
也会短路(第一个非真元素返回)。@yinnonsanders是的,我也注意到了这一点。然而,Christian的回答很好地证明了,如果你想做出区分,你可以将值与None
进行比较(并使用is
而不是=
),这就是我喜欢它的原因。你是对的。EAFP是Python中最常用的习惯用法。但是,dict.get
已经为您实现了逻辑,因此在这里使用它只会使代码更加冗长。我认为提供一个替代方法也很好。我更喜欢第一种方法,而不是其他答案(尽管第二种方法更有趣:-)-实际上,(在@ChristianDean的答案中)我认为在data.get()之后检查not None
不会验证字符串是否为非空。
foo = data.get('foo')
bar = data.get('bar')
if foo:
if bar:
dofoobar()
else:
dofoo()
elif bar:
dobar()
{(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!