使用 None 作为 itertools.accumulate 的初始值
Use None as initial for itertools.accumulate
最好将 itertools.accumulate
与 initial=None
结合使用,字面意思是它应该以 None
开头。
例如:
from typing import Optional, Iterable
from itertools import islice, accumulate
def f(a: Optional[A], b: B) -> A:
pass
b_s: Iterable[B] = [...]
_a_s = accumulate(b_s, f, initial=None) # doesn't work!
a_s = list(islice(_a_s, 1, None))
这失败了,因为 initial=None
告诉 accumulate
使用第一个元素作为初始元素并从那里开始,所以 f
最终会被调用两个 B
参数。
有人知道解决这个问题的简单方法吗?
我目前的计划是使用 False
,但是我还有很多麻烦要跳过来解释我对 MyPy 所做的事情。
您最好的选择可能是 chain
将值添加到输入可迭代对象中:
output = accumulate(chain([None], iterable), f)
最好将 itertools.accumulate
与 initial=None
结合使用,字面意思是它应该以 None
开头。
例如:
from typing import Optional, Iterable
from itertools import islice, accumulate
def f(a: Optional[A], b: B) -> A:
pass
b_s: Iterable[B] = [...]
_a_s = accumulate(b_s, f, initial=None) # doesn't work!
a_s = list(islice(_a_s, 1, None))
这失败了,因为 initial=None
告诉 accumulate
使用第一个元素作为初始元素并从那里开始,所以 f
最终会被调用两个 B
参数。
有人知道解决这个问题的简单方法吗?
我目前的计划是使用 False
,但是我还有很多麻烦要跳过来解释我对 MyPy 所做的事情。
您最好的选择可能是 chain
将值添加到输入可迭代对象中:
output = accumulate(chain([None], iterable), f)