Python:空字符串上更简洁的逻辑/语法

时间:2015-01-23 23:49:59

标签: python django logic string

我正在寻找一种更简洁的方式在Python中编写以下内容。

给定输入,检查输入中是否有两个变量:

if (input is not None and (
    (var_a == '' or (var_a != '' and var_a not in input))
    or (var_b == '' or (var_b != '' and var_b not in input))
)):
    # Do something...
    pass

因为'' in 'any string'评估为True,所以我不能简单地测试var_a not in input,因此增加的复杂性也会检查变量是否为空字符串。

希望我只是忽略了一种更简单的表达方式。

感谢。

P.S。我的变量实际上没有命名为inputvar_avar_b,请不要担心。

3 个答案:

答案 0 :(得分:2)

if input is not None and (
   not var_a or var_a not in input or  # Should this be 'or' or 'and'? 'or' looks unusual here
   not var_b or var_b not in input):
    pass

您可以跳过var_a != ''的检查,因为var_a == '' or之后它们将始终为True。如果var_a == ''不能not var_a,则var_a等同于None(我猜它不可能,因为你不会检查一下)

修改

现在我想到了你,你也可以将not从第二个分支中分解出来:

if input is not None and not(
   var_a and var_a in input and
   var_b and var_b in input):
    pass

......或者整个表达方式:

if not (input is None or 
        var_a and var_a in input and
        var_b and var_b in input):
    pass

答案 1 :(得分:0)

根据定义,如果var_a或var_b不是假的,即为空,则它们必须为True,因此您只需要一次检查,而不是检查两种情况:

我会在if inp is not None内嵌入任何内容:

if inp is not None:
    if any((not var_a, var_a not in inp, not var_b, var_b not in inp)):
        # do whatever

In [26]: var_a = ""

In [27]: var_b = ""

In [28]: inp = "foo"

In [29]: (not var_a, var_a not in inp, not var_a, var_a not in inp)
Out[29]: (True, False, True, False)

答案 2 :(得分:-1)

list = [var_a, var_b, input]
if '' in list == FALSE:
        if var_a is in input or var_b is in input:
           # do something
else:
   #do something