设置与 None 的交集

Set Intersection with None

我在设置运算交集时遇到问题。

假设我有一个列表 A = [0,1,2,3] 和一个整数 B = 0。当我检查 if B in A: 时,我当然得到 True.

但是当AB默认等于None时,我不能做AB的交集操作.

我正在寻找一种方法来执行以下操作而不会出错:

A = None
B = None

if B in A:
    raise KeyError('B in A')

通常A是一个python列表,B是一个字符串。但是我需要将它们默认设置为 None ,而它们是我函数中的参数;它们的值必须为 None.

PS:使用搜索算法得到 TrueFalse。并不重要。我只需要得到 TrueFalse,这样我就可以安排我的报错了。

为什么不尝试检查 A 或 B 是否是 None 本身?

A = None
B = None

if None not in [A, B] and B in A:
    print('B in A')
else:
    print('B or A is None, or B is not in A')
A = [None, 1, 2]
B = None

if B in A: # where A should be a list, it should be iterable
    print('done')

输出

done

最简单的方法是设置 A = [] 而不是 A = None(对于最终将成为列表的内容来说这是一个合理的值)。

如果 A 是函数的参数,请注意不要写

def f(A=[])

但是,相反

def f(A=None):
    if A is None:
       A = []

你可以试试:

if B in (A or []):

所以如果 ANone 它会针对空列表进行测试并产生 False

如果 A 是一个空列表,它也会测试 or 最右边的操作数,但结果是一样的。

更大的范围:如果您的函数中有默认值 None

def foo(A=None,B=None):

将它们保留为 None,并在函数代码中更改它们以使默认参数不可变 ("Least Astonishment" and the Mutable Default Argument)。

if A is None:
   A = []

在函数中初始化 None 参数的通常方法是在所述函数的开头将它们分配给合理的默认值。我使用类型注释只是为了显示可以传递哪种值:

from typing import List, Optional

def check_intersect(A: Optional[List[str]] = None, B: Optional[str] = None):
    if A is None:
        A = []
    if B in A:  # this can't fail any more 
        raise KeyError('B in A')

in 关键字(如果它不是 for 循环的一部分当然..)需要一个 python 对象作为其右侧参数,即 函数, None 没有。

继续使用 None 作为默认参数,然后将 a 设置为空集 set 如果它是 None(我使用的是小写参数名称符合 python 约定):

def f(a=None, b=None):
   if a is None:
       a = set()

    if b in a:
        raise KeyError('b in a')

    if a.isdisjoint(other_set):
       ...