【问题标题】:Specifying "any" type using Python type hints使用 Python 类型提示指定“任何”类型
【发布时间】:2023-03-29 03:38:02
【问题描述】:

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

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

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

感谢帮助!

【问题讨论】:

标签: python python-3.x python-3.5 type-hinting


【解决方案1】:

根据您要使用的具体内容,有两种不同的选择:

  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 专门设计为一个“桥梁”,让您可以在程序中混合有类型和无类型的世界。我个人认为,如果你让这两个世界相当不同(例如,通过一个完全类型化的“核心”可能有一堆无类型代码包装它)而不是静态和动态类型的方法,那么对代码进行推理会更容易。

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

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

顺便说一句/作为建议,如果您要使用类型提示,我还强烈建议您一路走下去,并在开发过程中使用 mypy 等工具对您的代码进行实际类型检查。

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

(实际上,尝试一次对整个代码库进行类型检查会导致很多噪音——您可以尝试并做的是渐进地对代码库进行类型检查。例如,您可以配置mypy 仅对一组文件进行类型检查(您可能会随着时间的推移而增长?),使某些检查更严格或更宽松(可能基于每个文件)等等。这适用于“类型化核心,非类型化包装器” 上面提到的策略。)

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 2020-12-24
    • 2016-08-17
    • 2022-09-30
    • 2016-02-29
    • 2021-10-19
    • 2014-09-11
    • 2022-07-28
    相关资源
    最近更新 更多