0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python的类型系统

zhKF_jqr_AI 来源:未知 作者:李倩 2018-11-24 09:34 次阅读

编者按:Feedly联合创始人、大数据与机器学习主管Kireet Reddy分享了对Python类型提示的看法。

升级到Python 3.6后,突然发现Python通过typing模块加入了类型提示。我得承认,我并不非常熟悉python社区,但是我觉得这样一种语言特性应该会引起不小的反响。

不管怎么说,我对这个新特性非常满意。在我职业生涯的大部分时间里,我在Java这个静态类型的世界中工作,python的类型提示多少提供了一些我很怀念的必需结构。

Python的类型系统

Python是一个动态类型语言,所谓的“鸭子类型”。使用Python编程时,动态类型大概是一把至为锋利的双刃剑。

基本上这意味着,Python并不会在编译步骤预先检查所有使用的类型是合法的,Python程序将继续愉快地运行下去,直到运行不下去为止,这时它会抛出一个TypeError。例如,下面这段Java代码编译不过:

publicstaticint add(int a, int b) { return a+b;}

...

add(1, "1");

Java编译器会立即抱怨传入了一个不兼容的类型。然而,你最喜欢的python IDE一点也不会抱怨这段等价的Python代码:

def add(a,b):

return a+b

...

add(1,"1")

你需要运行代码,才能碰到报错(整型和字符串无法相加)。

这真是糟糕。但是看看这个:

>>> add(‘hello’, ‘world’)

‘helloworld’

>>> add([1,2,3], [4,5,6])

[1, 2, 3, 4, 5, 6]

好吧,看来动态类型也不完全是坏事。这同样适用于类,只要对象存在恰当的方法,python代码可以直接工作,无需使用接口

classDog(object):

def talk(self, quietly):

return'woof'if quietly else'BARK'

classCat(object):

def talk(self, quietly):

return'purr'if quietly else'YOWL'

def speak(a, quietly):

print(a.talk(quietly))

>>> speak(Dog())

woof

>>> speak(Cat())

meow

妙!少打很多字,代码非常凝练。

问题

在python项目的起初几周这让人感觉良好。不过接下来一周你可能离开这个项目去改进以前写的另一些代码。或者你需要和一个同事一起编程。

过了一段时间你回头看代码的时候,或者同事看你的代码的时候,看到speak(x)这行会觉得x太含糊。于是决定跳转到speak的定义,结果看到了a.talk。下面就没法进一步跳转到定义追踪下去了,需要手动搜索查看哪些地方实现了talk这一方法,接着还需要查看这些方法做了什么,尝试推断出speak在talk上施加的一般契约。

解决方案

类型提示让你可以提供更多的上下文。重写上面的代码:

classDog(Animal):

def talk(self, quietly: bool) -> str:

return'woof'if quietly else'BARK'

classCat(Animal):

def talk(self, quietly: bool) -> str:

return'purr'if quietly else'YOWL'

def speak(a:Union[Dog, Cat], quietly: bool) -> None:

print(a.talk(quietly))

你可能已经注意到了,类型提示位于冒号和箭头之后。注意它传递的额外信息。现在我们一眼就能看到speak期望Dog或Cat,而布尔值标记指明是否应该小声说话(返回小写字母)。如果我们期望将来有更多说话者的类型,那么这种写法会变得累赘吗?会,但这大概意味着我们应该引入基类。

没有类型提示,基本上很难编写不言自明(self-documenting)的代码。你将不得不重度依赖极好的命名,一丝不苟的注释,还有代码的清洁程度。这其实是相当高的门槛。

一个额外的好处是,PyCharm等许多IDE支持类型提示,如果你没有传入恰当的参数,会通过下划曲线标出错误。

我强烈建议在新代码中使用类型提示,接着逐渐更新老代码。它们不仅为你节省了一些阅读代码的时间,更重要的是减轻了记住你所有的变量应该是什么类型的心智负担。

如果你想了解更多关于类型提示的内容,请查看python文档。升级到Python 3.6后我们在Feedly强调了类型提示的重要性,后来我收到了这么一条slack消息:

(译文:加入feedly前我并不知道python有类型提示。有了类型提示,阅读其他人的代码要容易太多!)

一切如你所想地工作的时候,感觉真不错。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66764
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48614
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466

原文标题:给Python加上额外的类型提示值得吗?

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python中常用的数据类型

    数据类型是每种编程语言必备属性,只有给数据赋予明确的数据类型,计算机才能对数据进行处理运算,因此,正确使用数据类型是十分必要的,不同的语言,数据类型类似,但具体表示方法有所不同,以下是
    发表于 04-19 15:14

    史上最全Python数据类型详解

    数据类型是每个编程语言必不可少的基础知识,也是必须要掌握的技能,很多人知识简单的进行理解,并没有很系统的进行知识的梳理,以下是对python语言的全部数据类型详细汇总:
    发表于 06-15 14:57

    总结:一文了解Python中的数字类型

    调一下Python的变量和数据类型的关系,变量只是对某个对象的引用或者说代号、名字、调用等等,变量本身没有数据类型的概念 。只有1,[1,2],"hello"这一类对象才具有数据类型
    发表于 09-26 16:49

    python的数据类型有哪些?

    python的数据类型有哪些?Python定义函数一般格式是什么?
    发表于 12-27 06:26

    2.2 python字符串类型

    2.2 python字符串类型1. 如何定义字符串?字符串是Python中最常用的数据类型之一。使用单引号或双引号来创建字符串,使用三引号创建多行字符串。字符串要么使用两个单引号,要么
    发表于 02-17 17:12

    python常见异常类型

    python常见异常类型在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的,比如语法错误、调用错误,甚至逻辑错误。下面这个例子,在输入 if 后输入回车了,没有按照
    发表于 03-04 16:59

    Python数据类型有几种

    Python编程常用的数据类型:  1. 数字类型  Python数字类型主要包括int(整型)、long(长整型)和float(浮点型)
    发表于 02-18 17:59 1404次阅读

    Python并不是弱类型语言

    Python是弱类型Python并不是弱类型Python是动态型强类型语言。
    的头像 发表于 04-21 17:45 4397次阅读
    <b class='flag-5'>Python</b>并不是弱<b class='flag-5'>类型</b>语言

    循序渐进学Python之数值类型

    本文将介绍Python语言的一种基本数据类型:数值类型。首先,我们会详细介绍Python语言各种数值类型以及相应的算术运算和它们的优先级、结
    发表于 05-31 15:11 4次下载

    2.2 python字符串类型

    2.2 python字符串类型 1. 如何定义字符串? 字符串是Python中最常用的数据类型之一。 使用单引号或双引号来创建字符串,使用三引号创建多行字符串。字符串要么使用两个单引号
    的头像 发表于 02-17 17:08 1228次阅读

    Python的数据类型与变量赋值

    Python有六个标准的数据类型:Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)、Dictionary(字典)。
    的头像 发表于 02-10 10:23 1381次阅读

    Python最基本内置数据类型(1)

    最基本内置数据类型 1. 基本数据类型和运算符 python中变量没有类型,但是对象都有类型 pytho
    的头像 发表于 03-08 17:17 661次阅读
    <b class='flag-5'>Python</b>最基本内置数据<b class='flag-5'>类型</b>(1)

    浅析python的变量类型

    python不需要事先声明变量。 python的变量类型是在运行过程中自动决定的,不需要代码声明类型
    的头像 发表于 03-10 10:11 585次阅读
    浅析<b class='flag-5'>python</b>的变量<b class='flag-5'>类型</b>

    python变量与基本数据类型介绍

    1、前言 熟练掌握一门编程语言,最好的方法就是充分了解,掌握基础知识,并亲自体验,多敲代码,熟能生巧。本文首先介绍python基础知识的保留字与标识符,然后将介绍在python中如何使用变量以及各种数据类型
    的头像 发表于 07-05 15:51 542次阅读

    python中的set类型

    Python中的set类型是一种无序、可变的集合数据类型,它的主要特点是不允许重复元素的存在。本文将详尽、详实、细致地介绍set类型的使用场景、常用操作以及与其他
    的头像 发表于 11-21 16:25 281次阅读