python - 充当**解包映射的类

标签 python class mapping argument-unpacking

如果没有子类化dict,一个类需要被认为是一个映射,以便它可以通过**传递给一个方法。

from abc import ABCMeta

class uobj:
    __metaclass__ = ABCMeta

uobj.register(dict)

def f(**k): return k

o = uobj()
f(**o)

# outputs: f() argument after ** must be a mapping, not uobj

至少到了它会抛出缺少映射功能的错误,所以我可以开始实现。

我回顾了模拟容器类型,但简单地定义魔术方法没有效果,并且使用 ABCMeta 覆盖并将其注册为 dict 将断言验证为子类,但失败 isinstance(o, dict )。理想情况下,我什至不想使用 ABCMeta

最佳答案

__getitem__()keys() 方法就足够了:

>>> class D:
        def keys(self):
            return ['a', 'b']
        def __getitem__(self, key):
            return key.upper()


>>> def f(**kwds):
        print kwds


>>> f(**D())
{'a': 'A', 'b': 'B'}

关于python - 充当**解包映射的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8601268/

相关文章:

java - GAE 应用程序在 tomcat 上给出错误 500;运行 javac.exe 编译器时出错

c++ - 将函数递归映射到 vector

python - Pandas :TypeError:sort_values()缺少 1 个必需的位置参数: 'by'

Python 属性错误 : Object has no attribute in Unittest

sql - 从一个表中选择在另一个表中存在映射的行

java - 我什么时候应该使用哈希而不是类

iOS - 澄清类和实例方法

python - 类型错误 : unsupported operand type(s) for *: 'int' and 'NoneType'

python - key 错误:0 - loc

python - 是否可以在现有应用程序中嵌入 Python REST API?