指定"任何"使用Python类型提示键入

时间:2017-12-29 02:43:42

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

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

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

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

感谢帮助!

1 个答案:

答案 0 :(得分:2)

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

  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...
    
  3. 我个人倾向于使用object - Any专门设计为“桥梁”,可让您在程序中混合使用类型和无类型的世界。我个人认为如果你保持这两个世界相当不同(例如,通过使用一个完全类型化的“核心”,可能包含一堆无类型代码),而不是静态和动态类型的方法,我更容易推理代码。

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

      

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

    作为一个建议,如果您打算使用类型提示,我还强烈建议您一直使用mypy等工具作为开发过程的一部分来检查您的代码。< / p>

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

    (实际上,尝试一次性检查整个代码库会导致很多噪音 - 你可以尝试做的事情是逐步检查你的代码库。例如,你可以配置mypy to typecheck只是一组文件列表(你可能会随着时间的推移而增长?),使某些检查更严格或更宽松(可能基于每个文件),等等。这适用于“类型化核心,无类型包装器” “上面提到的战略。”