当前位置: 首页 > 面试题库 >

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

卓致远
2023-03-14
问题内容

如何覆盖解压缩语法*obj和的结果**obj

例如,您能否以某种方式创建thing行为如下的对象:

>>> [*thing]
['a', 'b', 'c']
>>> [x for x in thing]
['d', 'e', 'f']
>>> {**thing}
{'hello world': 'I am a potato!!'}

注意: 迭代通过__iter__(“ for x in something”)从* splat解包返回不同的元素。

我查看了operator.muloperator.pow,但是这些函数仅涉及两个操作数(如a*b和)的用法a**b,并且似乎与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



 类似资料:
  • 本文向大家介绍Ruby数组和splat(*)运算符,包括了Ruby数组和splat(*)运算符的使用技巧和注意事项,需要的朋友参考一下 示例 的*操作者可用于解压缩变量和数组,使得它们可以作为一个独立的参数的方法进行传递。 如果尚未将单个对象包装在Array中,则可以使用它: 在上面的示例中,该wrap_in_array方法接受一个参数value。 如果value为Array,则将其元素解压缩,并

  • 在前面的章节中,我们已经了解了如何定义函数并调用函数并将参数传递给它。 通常,我们可以将固定数量的参数传递给函数。 编程时,我们可能会面临需要将变量参数传递给这些函数的情况。 在JavaScript中,我们使用对象接受函数的可变数量的参数。 CoffeeScript提供了一个名为splats的功能,可以将多个参数传递给函数。 我们在函数中使用splats,在参数名称后放置三个点,并用...表示 语

  • 问题内容: 我经常使用Python的语句来显示数据。是的,我知道方法,方法和方法。我也知道splat运算符()可用于将Iterable扩展为函数参数。但是,我似乎无法通过声明来做到这一点。使用清单: 使用元组: 我想念什么吗?这根本不可能吗?接下来到底是什么?该文档说该关键字后面是逗号分隔的表达式列表,但是我想这与列表数据类型不同。我在SO和Web上做了很多挖掘工作,却没有找到明确的解释。 我正在

  • 问题内容: 我经常使用Python,现在我正在快速学习JavaScript(或者应该说是重新学习)。所以,我想问问,JavaScript和的等效之处是什么? 问题答案: 最接近的成语是 利用函数定义中给定的参数个数这一事实。 您可以将其打包到一些帮助程序中,例如 然后做 如果您想使用语法糖,请编写一个函数,该函数将一个函数转换为另一个函数,该函数使用必需和可选参数调用,并将必需参数以及任何其他可选

  • 问题内容: 有人知道为什么不能在涉及迭代器/列表/元组的表达式中使用一元()运算符的原因吗? 为什么只限于功能解压缩?还是我认为这是错误的? 例如: 操作员为何不: 而当运算符与函数调用一起使用时,它的确会扩展: 使用列表时,和之间存在相似之处,而使用其他类型扩展列表时则没有相似之处。 例如: 问题答案: 如 PEP 448中 所述,已在Python中添加了对列表,字典,集合和元组文字进行解包的功

  • 问题内容: 我在Eclipse Helios中遇到一个奇怪的问题。当我更改源代码时,所做的更改无效。即使我以看起来无法编译的方式更改代码,它仍然可以运行。 似乎在我编辑和保存源并将其提交到svn时,Eclipse将其状态保留在后台的某个位置。 我不知道要查询什么设置或要做什么。我很高兴得到任何帮助。 最好的问候,大卫 问题答案: 注意:只有在该线程中的其他选项用尽时,才可以尝试此操作。 因此,以防