我们在Python 3.5应用程序中有一个方法,其中一个in-parameters(下例中的new_value
)可以是任何类型,我们想知道是否有一个类型提示我们可以用于这种情况?
def update(self, col_name: str, new_value) -> None:
(我们希望类型提示用于文档目的,以使代码更易于阅读)
感谢帮助!
根据您要使用的具体内容,有两种不同的选择:
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...
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来检查只有一组文件(您可能会随着时间的推移而增长?),使某些检查更严格或更宽松(可能基于每个文件),等等。这适用于上面提到的“类型化核心,无类型包装”策略。)