当前位置: 首页 > 科技观察

为什么Python没有void关键字?

时间:2023-03-17 17:57:49 科技观察

void是编程语言中非常常见的关键字之一。从字面上看,它的意思是“空,空集,空白”,最常用于表示函数的返回值类型。维基百科上有这样的定义:void类型,在从C和Algol68派生出的几种编程语言中,是指函数正常返回,但不向其调用者提供结果值的结果类型。在C、Algol68和它们派生出的几种编程语言中,void类型是函数正常返回的类型,但不向调用者返回值。简单的说,void是一种类型(type),但是没有具体的值(value)。这是什么意思?以Python的几种常见类型为例,从比较中可以看出规律:int是一种表示整数的类型,它有无限可能的整数值;bool是一个布尔类型,它有两个可能的值(True和False);NoneType是一种表示None的类型,它只有一个值(None)。至于void,它是一种更抽象的特殊类型,但不包含任何值。介绍完概念意义,我们就可以进入正题了。题目中的问题可以进一步分解为两个:为什么其他语言都使用void关键字?为什么Python不设计void关键字?第一个问题,我们以C/C++为例,先看看两种void的使用场景(PS:这里只考虑函数的使用,不考虑指针的使用,因为Python不havepointers):当void用在函数的参数位置时,表示该函数不需要传递参数。最初,C语言中的f()意味着参数个数不确定。为了表达“不需要参数”的语义,引入了f(void)作为限制。后来的语言(包括Python)基本不在参数中使用void,而是直接使用f()表示不需要传递参数。为了与C兼容,C++同时支持这两种语法。当void作为函数前面的修饰语时,表示该函数没有返回值。在C语言中,如果没有声明返回类型,f()函数在编译后将返回一个整数值。为避免混淆,请在不需要返回值时使用voidf()进行限定。同时,更重要的是,它还起到了占位符的作用,表明一个函数的类型是已知的,有助于代码的可读性和编译性。void作为函数的空返回值类型,C++/Java也继承了这种用法。另外,Javascript中也有void,只是变成了一个运算符,起着完全不同的作用,这里就不展示了。但是,Python始终没有void关键字。为什么是这样?是因为其他语言面临的问题在Python中不存在吗?或者,Python有自己的一套解决方案吗?我们还是以函数相关的两种用法为例来分析一下。在表达一个函数不需要传递参数时,f(void)的写法简直是多余的,所以Python使用了最简单明了的无参写法f()。至于返回值类型的使用,当我们定义一个函数时,比如最简单的deffunc():pass,为了让它的调用结果func()成为一个合法的对象,它必须有一个有效的类型(type).这应该是基于类型的编程语言常遇到的问题,Python也不例外。这时候,如果函数本身没有显式返回一个对象,有两种可能的解决方法:方法一是把函数声明为void类型,像C等语言一样,只要传递类型即可check方法2是Python使用的方法,即解释器隐式返回一个None对象,即函数默认获取一个NoneType类型,然后用于类型检查(PS:Javascript类似,但默认为返回的是undefined,不是对象,而是代表“undefined”的类型,类似于void)简单来说,Python的设计思路就是直接复用已有的NoneType类型,让解释器补上缺失的函数类型。关于Python解释器的隐式填充过程,我在之前的文章《Python 函数为什么会默认返回 None?》中有详细的分析,有兴趣的同学可以看看。这样做至少有两个好处:第一,没有引入新的void类型和关键字;其次,不需要程序员在函数前声明返回类型,与显式返回值的写法一致。试想一下,如果Python默认不让函数返回值,可能要写成voiddeffunc():...的形式,那就成了函数定义的特例了。将其与另一个特殊情况函数对比,异步函数asycdeffunc():...可能会引起混淆。总的来说,Python似乎认为void空类型没那么必要,似乎NoneType类型就够了,而且当返回值缺失时,解释器统一注入极其方便,所以现状我们看到出现。至此,文章标题中的问题得到了圆满的解答。最后,进入结局:本文本应以“为什么Python没有void关键字”开头,但实际上针对的是“为什么Python需要返回None”这个问题。在这篇《Python 函数为什么会默认返回 None?》中,我介绍了Python中的函数默认返回None的机制,属于“howcan”的内容。但是为什么默认返回None呢?这是一个“为什么需要”或“为什么应该”的问题,需要从没有void关键字开始……那么,为什么Python没有void关键字呢?请到Turnup重新阅读这篇文章...本文属于“WhyPython”系列(Python猫出品),主要关注Python的语法、设计、开发等话题。从每个“为什么”问题开始,尝试展示Python的魅力。所有文章都会存档在Github上,项目地址:https://github.com/chinesehuazhou/python-whydo