Closed iamjinlei0312 closed 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 真正的用途比这个要复杂很多,各个编程语言对其实现差异也比较大,而且目前也用不着,所以以后再深入学习吧。
明白了,谢谢老师!
关于问题相关资料补充:
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.
老师好,
<图1>
一、如图1所示,提示中
extend
“参数”部分那些符号是什么含义?这样写的意义是什么?1.
:
左边为什么要双下划线开头?是像老师课件上说的用_
开头是为了表达“私有”的意思吗? 呀,老师这里说了 https://github.com/neolee/wop-community/issues/121#issuecomment-658211196为什么要用
___iterable: Iterable[_T]
这样的方式,是为了说明变量以及变量的类型吗?_T
是什么意思?->
None
应该是指返回值为None
吧当我们自己在写函数的时候是否也参考这样的方式
二、此外,像这样的写法我在 Spark 的 Scala API Docs 中也见到过(图2),这里的
(U, T) => U
这样的表达方式完全看蒙了,不知道这是否是一种惯例还是其他什么的。<图2>
三、然后,我点了一下图1中蓝色的
list
,如图3所示。那目前可以弄清楚的是:图1给出的提示是list
这个class
中对于extend
这个method
的定义。那这里的[_T]
依然没整明白这玩意儿是干啥的?啥意思?<图3>
又发现了图4这种
[_T_co]
:<图4>