设置与 None 的交集
Set Intersection with None
我在设置运算交集时遇到问题。
假设我有一个列表 A = [0,1,2,3]
和一个整数 B = 0
。当我检查 if B in A:
时,我当然得到 True
.
但是当A
和B
默认等于None
时,我不能做A
和B
的交集操作.
我正在寻找一种方法来执行以下操作而不会出错:
A = None
B = None
if B in A:
raise KeyError('B in A')
通常A
是一个python列表,B
是一个字符串。但是我需要将它们默认设置为 None
,而它们是我函数中的参数;它们的值必须为 None
.
PS:使用搜索算法得到 True
或 False
。并不重要。我只需要得到 True
或 False
,这样我就可以安排我的报错了。
为什么不尝试检查 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 []):
所以如果 A
是 None
它会针对空列表进行测试并产生 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):
...
我在设置运算交集时遇到问题。
假设我有一个列表 A = [0,1,2,3]
和一个整数 B = 0
。当我检查 if B in A:
时,我当然得到 True
.
但是当A
和B
默认等于None
时,我不能做A
和B
的交集操作.
我正在寻找一种方法来执行以下操作而不会出错:
A = None
B = None
if B in A:
raise KeyError('B in A')
通常A
是一个python列表,B
是一个字符串。但是我需要将它们默认设置为 None
,而它们是我函数中的参数;它们的值必须为 None
.
PS:使用搜索算法得到 True
或 False
。并不重要。我只需要得到 True
或 False
,这样我就可以安排我的报错了。
为什么不尝试检查 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 []):
所以如果 A
是 None
它会针对空列表进行测试并产生 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):
...