python中的类型注释意味着静态类型检查?

2024-04-24 17:12:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究python中的typing模块,因为我希望在用python编写的项目中实施一些静态类型检查。在

当我定义一个像the one from the doc这样的函数时

def greeting(name: str) -> str:
    return 'Hello ' + name

尝试做类似greeting(3)的操作,我确实得到了以下错误

^{pr2}$

但是当我再次定义一个名为test的函数时

def test(a: int) -> None:
    print(a)

test("a"),我已经打印了a,没有出现任何错误。我也试过了

def test(a: str) -> None:
    print(a)

并执行test(3),但不会引发TypeError。在

我在完全相同的环境中定义了这两个函数,即使用iTerm的交互python会话。为什么会这样?在


Tags: 模块the项目函数nametestnonetyping
2条回答

python中的类型注释不实施静态类型检查。在

Python仍然是一种动态语言,解释器在执行循环中到达这一行时,会检查它是否有执行操作的方法,添加str(“hello”)并添加一个整数(3)。Pep-484声明核心开发人员不想用注解来改变这一点。在

如果您查看文档,它被称为'type hints'。暗示不是强制执行。在

类型提示实际上是为开发人员及其工具(如ide)提供的,以更好地记录参数的预期类型。但是添加这种形式的文档并没有对论点施加任何限制。它仅仅是文档。事实上,最好将这些注释看作文档。在

您看到的错误在没有这些注释的情况下发生。E、 g

>>> "Hello" + 3
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

如果你愿意,可以开发工具来完成这项工作。对象的注释

^{pr2}$

为什么会这样? 在python中,我们通常不做显式类型检查。相反,我们只是尝试调用该方法,比如“add'hello”和“3”,并允许出现错误。由函数的调用方提供正确的类型。但这也意味着要由函数的编写者来精确地记录参数。类型提示有助于描述预期的类型,并使其在对象上可用,这对于其他工具随后挂接非常有用。以前,我们会把这些东西写成文档,比如:

def greeting(name):
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello" + name

使用duck类型帮助您 如果在调用add之前使用内置字符串格式或将传入值强制转换为字符串,则可以避免引发的类型错误。例如,为了避免您看到的错误,您可以:

 def greeting(name: str) -> str:
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello" + str(name)

def greeting(name: str) -> str:
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello {}".format(name)

这里的线索在行号中:当您试图添加'Hello'3时,错误发生在函数内部。解释器会检查类型注释的语法正确性,但不会以其他方式进行操作。在

^{}这样的项目使用注释进行状态类型检查和其他各种用途。在

相关问题 更多 >