Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字典值检查为not empty和not None_Python_Python 2.7 - Fatal编程技术网

Python字典值检查为not empty和not None

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

我有一本字典,可能有也可能没有一个或两个键“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()
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!