浅析PEP570新语法: 只接受位置参数


Posted in Python onOctober 15, 2019

最近 PEP 570被接受了,其实要加的这个Positional-Only Parameters原来在内置的C函数上有很多都用到了:

In : __builtin__.eval
Out: <function eval(source, globals=None, locals=None, /)>
In : __builtin__.len
Out: <function len(obj, /)>
In : __builtin__.divmod
Out: <function divmod(x, y, /)>

看它们的签名,最后都有一个/,/用途是 在/左面的这些参数,只能是位置参数(不能是关键字参数):

In : divmod(3, 2)
Out: (1, 1)
In : divmod(x=3, y=2)
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-28-6668f56246b2> in <module>
----> 1 divmod(x=3, y=2)
TypeError: divmod() takes no keyword arguments

如果使用关键字参数的方式,会报错。当然这个错有点莫名其妙。为什么要搞Positional-Only呢?就是强制使用者用位置参数!

再看一个例子(bytes):

In [68]: bytes??
Init signature: bytes(self, /, *args, **kwargs)
Docstring:
bytes(iterable_of_ints) -> bytes
bytes(string, encoding[, errors]) -> bytes
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
bytes(int) -> bytes object of size given by the parameter initialized with null bytes
bytes() -> empty bytes object
...
In : bytes('哈哈', 'utf-8')
Out: b'\xe5\x93\x88\xe5\x93\x88'
In : bytes('哈哈', encoding='utf-8')
Out: b'\xe5\x93\x88\xe5\x93\x88'

虽然bytes也有/,但是它只约束了左边的参数(这里只有一个self),之后的encoding可以用位置参数,也能用关键字参数。

通过PEP 570,我们写的Python代码也可以支持了。你可以这样写:

def name(p1, p2, /, p_or_kw, *, kw):
def name(p1, p2=None, /, p_or_kw=None, *, kw):
def name(p1, p2=None, /, *, kw):
def name(p1, p2=None, /):
def name(p1, p2, /, p_or_kw):
def name(p1, p2, /):

在 Python 3.8 时我们就能使用这个新语法啦。现在可以通过 PEP里面的几个简单例子,感受一下它的用法,期待哟

好了,就给大家介绍到这里,希望对大家有所帮助!

Python 相关文章推荐
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
Python中用altzone()方法处理时区的教程
May 22 Python
Python对数据库操作
Mar 28 Python
python实现杨辉三角思路
Jul 14 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
pybind11和numpy进行交互的方法
Jul 04 Python
python用match()函数爬数据方法详解
Jul 23 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
Python类成员继承重写的实现
Sep 16 Python
Python中random模块常用方法的使用教程
Oct 04 Python
Django自带用户认证系统使用方法解析
Nov 12 Python
python开发的自动化运维工具ansible详解
Aug 07 Python
浅析PEP572: 海象运算符
Oct 15 #Python
Python 导入文件过程图解
Oct 15 #Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 #Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 #Python
Python3安装pip工具的详细步骤
Oct 14 #Python
python区分不同数据类型的方法
Oct 14 #Python
django中瀑布流写法实例代码
Oct 14 #Python
You might like
php用数组返回无限分类的列表数据的代码
2010/08/08 PHP
PHP异常处理Exception类
2015/12/11 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
限制复选框的最大可选数
2006/07/01 Javascript
用js重建星际争霸
2006/12/22 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
vue自定义指令用法经典实例小结
2019/03/16 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
python3实现猜数字游戏
2020/12/07 Python
Python如何实现转换URL详解
2019/07/02 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Python 发送邮件方法总结
2020/08/10 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
英国最大的海报商店:GB Posters
2018/03/20 全球购物
学习群众路线的心得体会
2014/11/05 职场文书
怎么写工作检讨书
2014/11/16 职场文书