排除特定类型的类型提示

flu*_*ffy 22 python types

在Python中,是否可以声明一个类型提示来排除某些类型的匹配?

例如,有没有办法声明“ typing.Iterableexcept not str ”之类的类型提示?

小智 6

Python类型提示不支持排除类型,但是,您可以使用Union类型来指定您想要获取的类型。

所以像这样:

def x(x: Iterable[Union[int, str, dict]]):
    pass

x([1]) # correct
x([1, ""]) # correct
x([None]) # not correct
Run Code Online (Sandbox Code Playgroud)

Union[]如果你想获得除你可以做的事情之外的所有类型,一种缩短的方法:

expected_types = Union[int, str, dict]

def x(x: Iterable[expected_types]):
    pass
Run Code Online (Sandbox Code Playgroud)

这就像上面的代码一样工作。

  • 这就是我所害怕的。问题是我想支持任何“Iterable”(包含任何类型的对象),但*不*“str”(可迭代)本身。对我确实想要支持的类型进行“Union”可能会无限长。 (2认同)
  • 我的意思是我已经定义了一个注释类型,其中包含我想要支持的最常见的可迭代类型(str 除外),但这非常笨拙。无论如何,我希望得到一个更笼统的答案,但不一定能处理我在问题中描述的确切情况。我试图问一些更通用的问题,我不打算让回复停留在我的具体要求上。 (2认同)