浅析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实现的百度站长自动URL提交小工具
Jun 27 Python
Python利用多进程将大量数据放入有限内存的教程
Apr 01 Python
Python切换pip安装源的方法详解
Nov 18 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
python实现随机梯度下降(SGD)
Mar 24 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
Python3安装pip工具的详细步骤
Oct 14 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
python 利用zmail库发送邮件
Sep 11 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 HTML代码串 截取实现代码
2009/06/29 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
Django模板语言 Tags使用详解
2019/09/09 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
会计电算化专业自荐信
2014/03/15 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
环保标语大全
2014/06/12 职场文书
本科生自荐信
2014/06/18 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
地道战观后感500字
2015/06/04 职场文书
九九重阳节致辞
2015/07/31 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
Java数据结构之堆(优先队列)
2022/05/20 Java/Android