使用迭代器的可调用对象的名称? [关闭]

Posted

技术标签:

【中文标题】使用迭代器的可调用对象的名称? [关闭]【英文标题】:Name of a callable that consumes an iterator? [closed] 【发布时间】:2021-12-18 22:46:29 【问题描述】:

是否有一个通用术语可以描述迭代(或“消耗”)迭代器的无参数可调用对象的类型?

比如 io 对象的 .readline(),或者 iter(callable, sentinel) 中的可调用对象,或者 functools.partial(next, iterator) 函数。

我现在用 CursorFunc = Callable[[], Any] 表示,但如果有什么问题,我想将我的语言与现有的语言保持一致。

Builtins 到处都有IterableIterator 对象,但发现这种CursorFunc 类型也经常出现,并且想要一个(不是完全发明的)名称来描述它。

------------ 编辑(UTC 2021-11-04 19:10)-----------

附加信息以阐明什么是“光标函数”,它不是 Generator(在 python 意义上)。

from functools import partial
from typing import Generator, Iterator, Iterable

iterable = [1, 2, 3]
assert isinstance(iterable, Iterable)

iterator = iter(iterable)
assert isinstance(iterator, Iterator)

cursor_func = partial(next, iterator)
assert not isinstance(cursor_func, Generator)

# A generator is like...

def gen():
    yield from iterable

assert not isinstance(gen, Generator)

g = gen()
assert isinstance(g, Generator) and isinstance(g, Iterable) and isinstance(g, Iterator)

【问题讨论】:

消耗可迭代的东西将是一个迭代器。或者,使用一个不太具体的术语,消费者 @JohnGordon 我不会使用“消费”这个词,但我明白你的意思。在这种情况下,我认为他们的意思不同 @JohnGordon,是的,它是一个 迭代器,但是您通过 nextfor ... 迭代一个迭代器。我要强调的区别是该对象是一个可调用对象(即functools.partial(next, iterator)),您调用它来获取下一个项目。 所以基本上你是在描述像next() 这样的可调用对象,但没有参数,对吧? @wjandrea -- 准确地说,如果你这样做了functools.partial(next, iterator)),你会得到什么。 【参考方案1】:

通常这些东西被称为 generatorseg,在“随机数生成器”或in C++)中,尽管在 Python 中这当然是指a specific means of constructing an iterator (可以从中派生出另一种生成器)。

【讨论】:

我刚刚编辑了这篇文章,通过代码断言来争论(对于 python 而言),生成器不是正确的术语。 @thorwhalen:你实际上并没有“对于typing 的目的,我应该怎么称呼它?”,这可能太基于意见了;你问是否有一个通用术语,这是。 生成器生产迭代器,而不是消耗它们。 @JohnGordon:两者兼有:lambda: next(my_iter) 在内部消耗 my_iter,但在外部可以被视为值的来源(非 Python 意义上的“生成器”)。

以上是关于使用迭代器的可调用对象的名称? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python初探第二篇-装饰器和迭代器,生成器

装饰器

装置器

使用可调用参数重载可调用对象

装饰器

如何为我的 IDE 编写/引用易于管理的 PHP 可调用函数