栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

更改* splat和** splatty-splat运算符对我的对象所做的操作

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

更改* splat和** splatty-splat运算符对我的对象所做的操作

*
迭代对象,并将其元素用作参数。
**
迭代对象的,
keys
并使用
__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并执行普通操作
update
以从关键字参数中对其进行初始化(除非该方法
PyDict_Update
不接受键值对列表)。因此,您不能
**
与实现映射协议分开进行自定义。

同样,对于

*
参数,
ext_do_call
执行

        if (!PyTuple_Check(stararg)) { PyObject *t = NULL; t = PySequence_Tuple(stararg);

等同于

tuple(args)
。因此,您不能
*
与普通迭代分开进行自定义。

如果

f(*thing)
并且
f(*iter(thing))
做了不同的事情,那将令人非常困惑。在任何情况下,
*
并且
**
是函数调用语法的一部分,而不是独立的运营商,所以他们定制(如果可能)将是可调用的工作,而不是争论的。我想可能会有用例允许可调用对象自定义它们,也许
dict
像这样传递子类
defaultdict



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/638592.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号