在python中,不需要指定方法参数类型。 Python动态地解释它们。
但是在一些代码片段中,我看到了正在定义的类型。
def method(p1: int, p2: int) -> None
1)为什么要这样做 2)对于其他数据结构,我只需要定义数据结构,而不定义它接受的参数类型
def multiply(num1: list, num2: list):
为什么这样的设计是目的。
以及为什么不允许我定义列表的类型
def multiply(num1: list[int], num2: list[int]):
答案 0 :(得分:3)
对于脚本的执行,类型注释是不相关的(它们被解释器丢弃)。
但是对于代码清晰而言,它们通常是一件好事。您可以立即查看特定函数/方法正在接受或返回的参数类型或返回类型。另外,IDE(例如PyCharm)通常在您尝试将其他类型传递给带注释的函数时突出显示或发出警告,并且可以更轻松地推断将带注释的函数的结果分配给的变量的类型。
话虽这么说,因为解释器不关心类型注释,所以它不会阻止您将错误的参数类型传递给函数(不同于注释)。例如,当您声明一个函数的返回类型为数字时,也是如此,但是在函数主体中,您返回一个字符串。 IDE可以突出显示它,但是解释器不在乎。
答案 1 :(得分:2)
通过将类型分配给别名来定义类型别名。在此示例中,Vector和List [float]将被视为可互换的同义词:
from typing import List
Vector = List[float]
def scale(scalar: float, vector: Vector) -> Vector:
return [scalar * num for num in vector]
# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])
所以重点是您必须from typing import List
,然后可以使用List[int]
或任何想要的类型
但是,这样做的目的是,它可以防止许多错误,特别是当几个人正在使用代码库并希望使用彼此的功能时。或者一段时间后回到项目,什么都不记得了
类型提示仅用于使代码对人眼更具可读性和可理解性。在List
中定义的typing
或任何其他类型的AFAIK甚至可能尚未实现任何逻辑或数据结构。
答案 2 :(得分:2)
类型提示对于确保接收到的参数符合您的预期非常有用。 就像合同或政策描述了您的函数要如何处理参数..通常,最常见的情况是使用OOP。
假设您的函数依赖于另一个对象,并且知道该对象包含一个名为foo的方法
class MyObject:
def foo():
print("called")
def my_method(obj: MyObject):
obj.foo()
我们有信心地调用foo方法,因为我们只接受从MyObject类实例化的对象,该对象我们肯定知道包含foo方法