浅析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读写Redis数据库操作示例
Mar 18 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
python实现拓扑排序的基本教程
Mar 11 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
python读取并写入mat文件的方法
Jul 12 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
Python测试线程应用程序过程解析
Dec 31 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
Python实现动态循环输出文字功能
May 07 Python
如何利用Python动态模拟太阳系运转
Sep 04 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
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
一个查看session内容的函数
2006/10/09 PHP
php 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
js读取本地文件的实例
2017/12/22 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
js实现录音上传功能
2019/11/22 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python之Web框架Django项目搭建全过程
2017/05/02 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
python实现静态服务器
2019/09/05 Python
Django实现基于类的分页功能
2019/10/31 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
Python如何批量生成和调用变量
2020/11/21 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
简历上的自我评价怎么写
2014/01/28 职场文书
个人授权委托书范本
2014/09/14 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
狮子林导游词
2015/02/03 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
详解Python牛顿插值法
2021/05/11 Python
nginx共享内存的机制详解
2022/03/21 Servers