neolee / wop-community

29 stars 19 forks source link

PyCharm 里鼠标悬停在 list.extend() 上所给提示的含义 #127

Closed iamjinlei0312 closed 4 years ago

iamjinlei0312 commented 4 years ago

老师好,

1241594883422_ pic_hd <图1>

一、如图1所示,提示中 extend “参数”部分那些符号是什么含义?这样写的意义是什么?

1.

___iterable: Iterable[_T]   
  1. _T 是什么意思?

  2. -> None 应该是指返回值为 None

  3. 当我们自己在写函数的时候是否也参考这样的方式

    def fun_name(arg1_name: arg1_type, arg2_name: arg2_type) -> (arg1_type, arg2_type):
    pass

二、此外,像这样的写法我在 Spark 的 Scala API Docs 中也见到过(图2),这里的 (U, T) => U 这样的表达方式完全看蒙了,不知道这是否是一种惯例还是其他什么的。

Xnip2020-07-16_15-20-15 <图2>

三、然后,我点了一下图1中蓝色的 list ,如图3所示。那目前可以弄清楚的是:图1给出的提示是 list 这个 class 中对于 extend 这个 method 的定义。那这里的 [_T] 依然没整明白这玩意儿是干啥的?啥意思?

1251594888513_ pic_hd <图3>

又发现了图4这种 [_T_co]

1261594893054_ pic_hd <图4>

neolee commented 4 years ago

PyCharm 的鼠标悬停信息提示是直接从 Python 源代码中读出的,而 Python 源代码是远比我们目前入门学习的内容要复杂一些的,会用到语言的一些高级特性。

比如你问到的这个东西,是 Python 从 3.5 版本开始加入的特性,叫做 Type Hints(PEP 484),具体的介绍在这里:

https://www.python.org/dev/peps/pep-0484/

你的几个具体问题在里面都有答案——其实你猜测的答案基本都对。

你看到的 _T 之类的东西是一种“类型变量(Type Var)” ,代表这里可以是某种或者某几种数据类型。要完整理解 PEP 484 并不简单,在目前阶段也不必须,所以可以量力而为。

顺便,如果你去查看官方的文档,你会看到 lst.extend() 方法的一个更友好的说明

list.extend(iterable)

目前阶段这样的文档可能会更有用一些。


然后是关于 Scala。Spark 是一个引擎,它支持你用几种不同的语言来操作它,Scala 是其中的一种,你看到的文档里的调用接口是 Scala 语言的,和 Spark 本身其实没有关系。

而 Scala 语言是支持所谓的 generics 这种语言特性的,就是可以用一个变量来指代任何数据类型,写出一些与具体数据类型无关的函数和类定义来,这个和上述 Python 里的 Type Var 有些类似,但更强大也更底层一些。

Generics 是一种非常强大的语言工具,但也会显著增加编程语言的复杂度,对这个东西的解释远超出我们课程的范围,不过既然你问了,我下面用一种“伪语言”大致解释下概念,供你参考。

比如你写了一个函数,可以处理两个整数的加法,大致长这样:

def add(a: int, b: int) -> int:
    return a + b

现在有人需要一个针对浮点数加法的函数,你只好再写一个类似这样的:

def add(a: float, b: float) -> float:
    return a + b

这俩函数长得几乎一样,多浪费啊,那么支持 generics 的语言就允许你写这么个东西:

def add(a: T, b: T) -> T:
    return a + b

可能还有些别的语法来限定 T 到底可以是啥(比如我们这里的 T 可以是 int、float 或者 str),然后你就可以调用这个 add 了,它以一当三,可以相当于三个不同类型的函数定义。

当然 generics 真正的用途比这个要复杂很多,各个编程语言对其实现差异也比较大,而且目前也用不着,所以以后再深入学习吧。

iamjinlei0312 commented 4 years ago

明白了,谢谢老师!

iamjinlei0312 commented 4 years ago

哦,对。还有一个补充的,就是我平时看 python 文档一般是两个选择:一个是去 Python 官网,另一个是在 Mac 用像 Dash 这种软件。简单分享给看到这个 issues 的有缘人,哈哈哈哈~

iamjinlei0312 commented 2 years ago

关于问题相关资料补充:

Type Theory

One important concept is that of subtypes. Formally, we say that a type T is a subtype of U if the following two conditions hold:

Every value from T is also in the set of values of U type. Every function from U type is also in the set of functions of T type.