当前位置: 首页 > 面试题库 >

Python类型提示语法如何/为什么起作用?

欧阳洲
2023-03-14
问题内容

我刚刚在PEP 484中看到以下示例

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

print(greeting('Martin'))
print(greeting(1))

不出所料,这在Python 2中不起作用:

  File "test.py", line 1
    def greeting(name: str) -> str:
                     ^
SyntaxError: invalid syntax

但是,它适用于Python 3:

Hello Martin
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print(greeting(1))
  File "test.py", line 2, in greeting
    return 'Hello ' + name
TypeError: Can't convert 'int' object to str implicitly

这是出乎意料的。如下面的示例所示,它实际上还没有检查类型(运行,但不会引发异常):

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

print(greeting('Martin'))

似乎在之后:必须是一个函数的名称,但是该函数似乎被忽略了:

def aha(something):
    print("aha")
    return something+"!"

def greeting(name: aha, foo) -> int:
    return 'Hello ' + name + foo

print(greeting('Martin', 'ad'))

之后的名称似乎也是如此->

这种类型的提示语法是否还使用了其他内容(例如Java Modeling
Language使用注释)?何时将这种语法引入Python?有没有办法使用此语法进行静态类型检查?它是否总是破坏Python 2的兼容性?


问题答案:

这里没有类型提示。您所做的只是提供 注释 ;这些是在PEP
3107
中引入的(仅在Python 3中,在Python
2中不支持此功能);它们允许您注释参数并使用任意信息返回值以供以后检查:

>>> greeting.__annotations__
{'name': <class 'str'>, 'return': <class 'str'>}

否则,此处完全不咨询他们。相反,您收到的错误消息来自尝试 在函数主体中 串联字符串和整数值:

>>> 'Hello ' + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

这是一个自定义类型错误,旨在提供有关str+int级联失败的其他信息;str.__add__对于任何非以下类型,该方法都会将其抛出str

>>> ''.__add__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> ''.__add__(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'bool' object to str implicitly

然后,PEP 484建议利用这些注释,通过 其他工具 进行实际的静态类型检查,但作为PEP的介绍如下:

尽管这些注释可以在运行时通过常用__annotations__属性使用, 但在运行时不会进行类型检查
。相反,该建议假设存在一个单独的脱机类型检查器,用户可以自愿在其源代码上运行该检查器。本质上,这种类型检查器可充当非常强大的linter。

强调原始。

PEP受到使用PEP 3107注释的现有工具的启发;特别是mypy项目(通过采用PEP
484循环返回),还包括PyCharm IDE和pytypedecl项目中的类型提示支持。请参阅Guido van
Rossum发动这项工作的原始电子邮件以及后续电子邮件。

mypy显然可以通过预处理注释来支持Python 2,在为源字节进行字节编译之前将其删除,但是通常您不能使用本来可以在Python
2中使用的语法Python代码。

PEP 484还描述了存根文件的使用,该存根文件位于常规Python文件的旁边。它们使用.pyi扩展名,并且仅包含签名(带有类型提示),而使主.py文件注释自由,因此可以在Python
2上使用(前提是您另外编写了Polyglot Python代码)。



 类似资料:
  • 问题内容: 我想为模块(类“模块”)添加(Python3)类型提示。该包不提供一个,并且是返回模块对象为特定名称的构造器。 例: 至少在PyCharm中导致“在types.pyi中找不到引用ModuleType”。 请注意,使用Python输入模块类型不会回答我的问题,因为它不能解释ModuleType既是构造函数又是类型,如下所示。 问题答案: 并且是构造函数。 没关系 就像和are一样,仍然是

  • 问题内容: 类型提示是Python 3.5中讨论最多的功能之一。 的一个例子类型提示中提到的这篇文章和这一个,同时还提负责任地使用类型提示。有人可以解释更多有关它们的信息,何时使用以及何时不使用? 问题答案: 我建议阅读PEP 483和PEP 484和观看该演示由Guido的类型提示。 简而言之:类型提示实际上是单词的意思,你可以提示所使用的对象的类型。 由于Python 的动态特性,推断或检查所

  • 例如: 由于指的是“nothing is return”,那么我们在这里如何使用return语句。这是否意味着所有程序都返回一些东西,不管它是void还是其他返回类型? 我还有一个关于作为返回类型的查询:

  • 问题内容: 我注意到python 3.5和python 3.6添加了许多有关静态类型检查的功能,因此我尝试使用以下代码(在python 3.6中为稳定版本)。 令我惊讶的是,尽管python附加到仅包含字符串的,但它却没有给我错误或警告。检测到类型错误并向我发出警告,但是它不明显,并且未在输出控制台中显示,我担心有时可能会错过它。我想要以下效果: 如果很明显如上所述我使用了错误的类型,请抛出警告或

  • 我正在编写一个包含一个对象的库,该对象允许对其某些方法进行方法链接。我想为这个库的用户提供一个简单的方法来知道是否有任何特定的方法支持链接(并且“用户”包括提供自动完成的IDE)。 根据这个问题和这个问题,通过在支持链接的方法调用结束时返回可以很容易地完成链接。 然而,这些问题都没有解决如何向用户表明一个方法支持链接(除了明显的docstring注释)。如下面的示例代码所示,我试图添加一个类型提示

  • 问题内容: 有人可以向我解释为什么以下代码示例中标记的行不起作用吗? 具体来说,当我们说类型为时,这并不表示它的每个元素都是的实例吗?如果是这样,那么它是什么铸造的问题,如果我们都可以投射单个实例来? 谢谢。 问题答案: 问题是这样的: 如果对数组执行相同的操作,则在运行时会在第4行获得ArrayStoreException。对于泛型集合,已决定在编译时避免这种情况。