使用 Python 类型提示指定 "any" 类型

Specifying "any" type using Python type hints

我们的 Python 3.5 应用程序中有一个方法,其中一个输入参数(下例中的 new_value)可以是任何类型,我们想知道是否有我们可以在这种情况下使用的类型提示?

def update(self, col_name: str, new_value) -> None:

(我们希望将类型提示用于文档目的,以使代码更易于阅读)

感谢帮助!

根据您的具体用途,有两种不同的选择:

  1. 如果您想完全退出类型检查 any_value 并表明它可以是零限制的任何类型,请使用 typing.Any。示例:

    from typing import Any
    
    class MyThing:
        def update(self, col_name: str, new_value: Any) -> None:
            # Note: this typechecks; new_value can be anything, and 
            # that object might have a foo method
            new_value.foo()  
            # ...snip...
    
  2. 如果你想表明 new_value 可以是任何类型,但又想确保 update 方法只在一个中使用 new_value完全类型安全的方式,我会使用 object,它是 Python:

    中每种类型的基本类型
    class MyThing:
        def update(self, col_name: str, new_value: object) -> None:
            # Note: this does not typecheck since new_value is of
            # type 'object', and 'object' is not guaranteed to have
            # a method named 'foo'
            new_value.foo()  
            # ...snip...
    

我个人偏向于使用 object -- Any 专门设计为 "bridge",它允许您在程序中混合类型化和非类型化的世界。我个人认为,如果您使这两个世界截然不同(例如,通过使用完全类型化的 "core" 可能包含一堆未类型化的代码来包装它)而不是静态和动态类型化的方法,我个人认为对代码进行推理会更容易。

当然,并不总是可以做到这一点...

(We would like the type hint for documentation purposes, to make the code easier to read)

作为一个 aside/as 的建议,如果您要使用类型提示,我还强烈建议您一路走下去,并使用 mypy 等工具实际对您的代码进行类型检查,作为您的代码的一部分发展历程.

对文档使用类型提示很棒,但如果您的代码不符合文档,它可能会非常混乱。由于我们拥有使用这些类型提示自动对代码进行类型检查的工具,我们不妨(并获得额外的保证)。

(实际上,尝试一次对整个代码库进行类型检查会导致很多噪音——您可以尝试做的是渐进式对您的代码库进行类型检查。对于例如,您可以将 mypy 配置为仅对一组文件列表进行类型检查(您可能会随着时间的推移而增长?),使某些检查更严格或更宽松(可能在每个文件的基础上),等等。这适用于 "typed core, untyped wrapper" 上面提到的策略。)