Python:如何断言iterable的第一个元素的类型?

Python:如何断言iterable的第一个元素的类型?,python,iterator,iterable,Python,Iterator,Iterable,我正在寻找一种“pythonic”方法来断言iterable中第一个元素的类型 例如,如果我有以下列表: l = [(1,2,3), (4,5,6), ...] 它被传递到一个函数中,我可以简单地做: def foo(l): assert isinstance(l[0], tuple) ... 现在我正在搜索类似的东西,它也可以与迭代器一起工作,但不会将整个列表加载到ram中。我可以试试: def foo(it): assert isinstance(next(it)

我正在寻找一种“pythonic”方法来断言iterable中第一个元素的类型

例如,如果我有以下列表:

l = [(1,2,3), (4,5,6), ...]
它被传递到一个函数中,我可以简单地做:

def foo(l):
    assert isinstance(l[0], tuple)
    ...
现在我正在搜索类似的东西,它也可以与迭代器一起工作,但不会将整个列表加载到ram中。我可以试试:

def foo(it):
    assert isinstance(next(it), tuple)
    ...

it = iter(l)
foo(it)
但这显然会修改断言中迭代器的状态

有没有一种简单的方法可以在不修改迭代器的情况下查看迭代器的第一个元素?

我目前(我觉得很难看)的解决方案是:

from itertools import tee

def foo(it):
    if __debug__:
        it1, it2 = tee(it, 2)
        assert isinstance(next(it1), tuple)
        it = it2
    ...

有没有更好/更酷的方法来窥视我不知道的第一个元素?

没问题,而且我无法想象另一个方法能可靠地在任何iterable上工作。见鬼!阅读,确实有一个更干净、更简单、更明显的方法;)因为它不知道
it1
不会被再次使用,所以
tee
不会强制缓冲生成器中的每个元素吗?谢谢,没有找到dup:-/但是使用
itertools.chain
作为他们的答案或
itertools.tee
作为我下面的答案是一样的…仅供参考,我通过搜索找到了它“PythonPeek迭代器”-也请看,是的,我太专注于“断言迭代器的第一个元素”,我想…我将把这个留给其他人去发现。