ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 改变* splat和** splatty-splat运算符对我的对象的作用

2019-09-27 08:56:52  阅读:577  来源: 互联网

标签:iterable-unpacking splat python double-splat


你如何覆盖解压缩语法* 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 …

标签:iterable-unpacking,splat,python,double-splat
来源: https://codeday.me/bug/20190927/1823313.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有