浅析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中fnmatch模块的使用详情
Nov 30 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
Django模型中字段属性choice使用说明
Mar 30 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
python适合做数据挖掘吗
Jun 16 Python
python实现最短路径的实例方法
Jul 19 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
使用Python爬取Json数据的示例代码
Dec 07 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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程序员应该了解MongoDB的五件事
2013/06/03 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
JS实现随机点名器
2020/04/12 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
python创建线程示例
2014/05/06 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
数控个人求职信范文
2014/02/03 职场文书
爱心捐款倡议书
2014/04/14 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
怒海潜将观后感
2015/06/11 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
python 安全地删除列表元素的方法
2022/03/16 Python
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python