【发布时间】:2021-07-10 01:29:54
【问题描述】:
我想编写一个 Python 函数,它将 Callable 对象和相应的参数作为输入,并返回从 Callable 对象到参数上这些对象的值的映射。更具体地说,代码可能如下所示。
>>> import collections
>>> import dataclasses
>>> from typing import Iterable, List, Mapping
>>> @dataclasses.dataclass(frozen=True)
... class Adder:
... x: int = 0
... def __call__(self, y: int) -> int:
... return self.x + y
...
>>> def fn_vals(fns: Iterable[Adder], vals: Iterable[int]) -> Mapping[Adder, List[int]]:
... values_from_function = collections.defaultdict(list)
... for fn in fns:
... for val in vals:
... values_from_function[fn].append(fn(val))
... return values_from_function
...
>>> fn_vals((Adder(), Adder(2)), (1, 2, 3))
defaultdict(<class 'list'>, {Adder(x=0): [1, 2, 3], Adder(x=2): [3, 4, 5]})
但是,我正在努力让它与更广泛的 Callable 对象类一起使用。特别是,以下失败并显示__hash__ 尚未实现的错误。
>>> import dataclasses
>>> from typing import Callable, Hashable
>>> class MyFunctionInterface(Callable, Hashable): pass
...
>>> @dataclasses.dataclass(frozen=True)
... class Adder(MyFunctionInterface):
... x: int = 0
... def __call__(self, y: int) -> int:
... return self.x + y
...
>>> Adder()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/alex/anaconda3/lib/python3.7/typing.py", line 814, in __new__
obj = super().__new__(cls)
TypeError: Can't instantiate abstract class Adder with abstract methods __hash__
我想修改我的fn_vals 函数,使fns 具有Iterable[MyFunctionInterface] 类型,因为我需要fns 的元素具有的唯一属性是它们是Callable 和Hashable .有没有办法表明数据类满足MyFunctionInterface,并且__hash__ 函数仍然由dataclass 装饰器生成?
【问题讨论】:
标签: python python-typing python-dataclasses