【问题标题】:Python: How to assert the type of the first element of an iterable? [duplicate]Python:如何断言可迭代的第一个元素的类型? [复制]
【发布时间】:2015-08-03 08:18:02
【问题描述】:

我正在寻找一种“pythonic”方式来断言迭代中第一个元素的类型。

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

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)

但这显然会修改断言中迭代器的状态。

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

【问题讨论】:

  • 谢谢,没有找到那个 dup :-/ 但是在他们的答案中使用 itertools.chain 或在我的下面使用 itertools.tee 有点相同...
  • 仅供参考,我通过搜索 "Python peek iterator" 找到了它 - 另请参阅 code.activestate.com/recipes/577361-peek-ahead-an-iterator
  • 是的,我太专注于“断言迭代器的第一个元素”,我想......我会把这个留给其他人去寻找。

标签: python iterator iterable


【解决方案1】:

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

from itertools import tee

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

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

【讨论】:

  • 不是 AFAIK,我无法想象另一个可以可靠地处理任何可迭代对象。
  • 见鬼!阅读stackoverflow.com/a/2425347/41316,确实有一个更清洁、更简单且非常明显的;)
  • tee 不强制缓冲生成器中的每个元素,因为它不知道 it1 不会再次使用?
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2016-09-21
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2021-08-11
  • 2018-06-11
  • 2013-01-05
相关资源
最近更新 更多