浅析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之Python文档
Oct 10 Python
Python格式化输出%s和%d
May 07 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Python实现Linux监控的方法
May 16 Python
python 获取等间隔的数组实例
Jul 04 Python
python实现串口通信的示例代码
Feb 10 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
Python-split()函数实例用法讲解
Dec 18 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删除左端与右端空格的方法
2014/11/29 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP实现验证码校验功能
2017/11/16 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
js播放wav文件(源码)
2013/04/22 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
利用python发送和接收邮件
2016/09/27 Python
Python自定义线程池实现方法分析
2018/02/07 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
QML使用Python的函数过程解析
2019/09/26 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
工程类专业自荐信范文
2014/03/09 职场文书
会计演讲稿范文
2014/05/23 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
大学生实习证明
2015/06/16 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers