我如何表明一个函数可以接受除字典之外的任何可迭代对象?

Posted

技术标签:

【中文标题】我如何表明一个函数可以接受除字典之外的任何可迭代对象?【英文标题】:How would I indicate that a function takes any iterable except a dictionary? 【发布时间】:2019-07-26 01:39:06 【问题描述】:

我有一个可以接受Iterable[int] 的函数,但我不想接受字典。我有另一种方法来处理它。如何在类型提示中指出这一点?

def unpack(iterable_to_unpack : Iterable[int]):

sequence 会更合适吗?

def unpack(sequence_to_unpack : Sequence[int]):

从iterable的definition看来,应该是这样的。

一个能够一次返回其成员的对象。示例 可迭代对象包括所有序列类型(例如 list、str 和 tuple) 以及一些非序列类型,如字典、文件对象..

【问题讨论】:

您必须检查参数的类型,如果是字典,则引发错误。 对,但Sequence[int] 是否是正确的类型提示,表明它只接受ListTuple 等,而不接受字典? 你不能简单地通过测试ListTupledict来测试Sequence[int]是否是正确的类型吗? 我可以,但我认为最好像这样测试它,if (isinstance(sequence_to_unpack, Mapping)): 但我仍然需要正确的类型提示。 【参考方案1】:

这有帮助吗?来自docs:

from typing import List
Vector = List[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])

【讨论】:

不,我想要我的方法只接受序列类型(列表、元组等)而不接受字典,所以我想知道什么是正确的类型提示。鉴于dict 继承自Iterable,我认为它不是正确的类型。

以上是关于我如何表明一个函数可以接受除字典之外的任何可迭代对象?的主要内容,如果未能解决你的问题,请参考以下文章

向接受任何可迭代并返回压缩值的函数添加类型提示

Python之集合函数

任何可迭代对象的值(而不是键)的通用迭代器

TS - 自定义可迭代 - for...of 错误

正则表达式:匹配除“<”、“”和“%”之外的任何内容

Excel中的连接字符串不允许除我之外的任何人刷新