我在设置操作交叉点时遇到麻烦。
假设我有一个列表A = [0,1,2,3]
和一个整数B = 0
。当我检查if B in A:
时,我当然会得到True
。
但是,当A
和B
默认等于None
时,我将无法进行A
和B
的相交运算。 / p>
我正在寻找一种不会出错的跟踪方式:
A = None
B = None
if B in A:
raise KeyError('B in A')
通常A
是python列表,而B
是字符串。但是我需要将它们默认设置为None
,而它们是我函数中的参数。它们必须具有None
的值。
PS:使用搜索算法获取True
或False
。并不重要。我只需要获取True
或False
,就可以安排我的错误提出了。
答案 0 :(得分:1)
为什么不尝试检查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')
答案 1 :(得分:1)
最简单的方法是设置A = []
而不是A = None
(这对于最终将成为列表的东西来说是一个合理的值)。
如果A
是函数的参数,请注意不要写
def f(A=[])
但是,相反
def f(A=None):
if A is None:
A = []
答案 2 :(得分:1)
您可以尝试:
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 = []
答案 3 :(得分:1)
继续使用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):
...
答案 4 :(得分:0)
A = [None, 1, 2]
B = None
if B in A: # where A should be a list, it should be iterable
print('done')
输出
done
答案 5 :(得分:0)
在函数中处理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对象作为offers a __contains__()
函数的右侧参数,其中None
没有。