浅析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模块顶层运行的代码引起的一个Bug
Jul 04 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
Python subprocess库的使用详解
Oct 26 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
Python编程在flask中模拟进行Restful的CRUD操作
Dec 28 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Python for i in range ()用法详解
Sep 18 Python
python对文档中元素删除,替换操作
Apr 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
用Zend Encode编写开发PHP程序
2010/02/21 PHP
基于php 随机数的深入理解
2013/06/05 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
标准PHP的AES加密算法类
2015/03/12 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
jQuery 表格插件整理
2010/04/27 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
javascript基本类型详解
2014/11/28 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
Python Deque 模块使用详解
2014/07/04 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Python 将pdf转成图片的方法
2018/04/23 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
通用C#笔试题附答案
2016/11/26 面试题
本科生详细的自我评价
2013/09/19 职场文书
委托证明的格式
2014/01/10 职场文书
父亲生日宴会答谢词
2014/01/10 职场文书
元旦获奖感言
2014/03/08 职场文书
法人身份证明书
2014/10/08 职场文书
长城导游词
2015/01/30 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers