我在设置操作交叉点时遇到问题。
假设我有一个列表A = [0,1,2,3],一个整数B = 0.当我检查A:中的B时,我当然是真的。
但是当A和B默认为……
为什么不尝试检查A或B本身是否为无?
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')
你可以尝试:
if B in (A or []):
因此,如果 A 是 None 它测试空列表和产量 False
A
None
False
如果 A 是一个空列表,它还将测试最右边的操作数 or 但结果将是一样的。
or
范围更大:如果您有默认值 None 在你的功能:
def foo(A=None,B=None):
把他们当成 None ,并在功能代码中更改它们,以便默认参数不可变( “最小的惊讶”和可变的默认论证 )。
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对象作为它的右侧参数 提供一个 __contains__() 功能,哪个 None 没有。
in
__contains__()
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 = []
A = None
如果 A 是你的功能的参数,小心你不写
def f(A=[])
但反而
def f(A=None): if A is None: A = []
继续使用 None 作为默认参数,然后设置 a 成为空集 set 如果是 None (我按照python约定使用小写参数名称):
a
set
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): ...