浅析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基础教程之五种数据类型详解
Jan 12 Python
Python中一些不为人知的基础技巧总结
May 19 Python
Python3.5运算符操作实例详解
Apr 25 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
np.random.seed() 的使用详解
Jan 14 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
python实现最速下降法
Mar 24 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
python爬取招聘要求等信息实例
Nov 20 Python
python3实现飞机大战
Nov 29 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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
Python生成器以及应用实例解析
2018/02/08 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
Python 线程池用法简单示例
2019/10/02 Python
vue路由实现登录拦截
2021/03/24 Vue.js
关于教师节的广播稿
2014/09/10 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
个人优缺点总结
2015/02/28 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS
各种货币符号快捷输入
2022/02/17 杂记