python – 改变* splat和** splatty-splat运算符对我的对象的作用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 改变* splat和** splatty-splat运算符对我的对象的作用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1707字,纯文字阅读大概需要3分钟。
内容图文
![python – 改变* splat和** splatty-splat运算符对我的对象的作用](/upload/InfoBanner/zyjiaocheng/709/84c5b5431ed7445dafd3f8088dea9b45.jpg)
你如何覆盖解压缩语法* obj和** obj的结果?
例如,你能以某种方式创建一个行为如下的对象:
>>> [*thing]
['a', 'b', 'c']
>>> [x for x in thing]
['d', 'e', 'f']
>>> {**thing}
{'hello world': 'I am a potato!!'}
注意:通过__iter __(“for x in thing”)的迭代返回* splat unpack中的不同元素.
我看了一下inoperator.mul和operator.pow,但这些函数只涉及两个操作数的用法,比如a * b和a ** b,看起来与splat操作无关.
解决方法:
*遍历对象并使用其元素作为参数. **遍历对象的键并使用__getitem__(相当于括号表示法)来获取键值对.要自定义*和**,只需使对象成为可迭代或映射:
class MyIterable(object):
def __iter__(self):
return iter([1, 2, 3])
class MyMapping(collections.Mapping):
def __iter__(self):
return iter('123')
def __getitem__(self, item):
return int(item)
def __len__(self):
return 3
如果你想要*和**除了上面描述的东西之外做什么,你就不能.我没有该声明的文档参考(因为它更容易找到“你可以做到这一点”的文档而不是“你不能这样做”),但我有一个源引用. PyEval_EvalFrameEx中的字节码解释器循环调用ext_do_call以使用*或**参数实现函数调用. ext_do_call包含以下代码:
if (!PyDict_Check(kwdict)) {
PyObject *d;
d = PyDict_New();
if (d == NULL)
goto ext_call_fail;
if (PyDict_Update(d, kwdict) != 0) {
如果**参数不是dict,则创建一个dict并执行普通更新以从关键字参数初始化它(除了PyDict_Update不接受键值对列表).因此,您无法独立于实现映射协议来自定义**.
同样,对于*参数,ext_do_call执行
if (!PyTuple_Check(stararg)) {
PyObject *t = NULL;
t = PySequence_Tuple(stararg);
这相当于元组(args).因此,您无法与普通迭代分开定制*.
如果f(* thing)和f(* iter(thing))做了不同的事情,那将是非常令人困惑的.在任何情况下,*和**都是函数调用语法的一部分,而不是单独的运算符,因此自定义它们(如果可能)将是可调用的作业,而不是参数.我想可能有一些用例允许callable自定义它们,也许是为了传递dict子类,比如defaultdict …
内容总结
以上是互联网集市为您收集整理的python – 改变* splat和** splatty-splat运算符对我的对象的作用全部内容,希望文章能够帮你解决python – 改变* splat和** splatty-splat运算符对我的对象的作用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。