如何解决将 MyPy 与 Typing.DefaultDict 与固定工厂功能一起使用 我想做这样的事情:子类化并覆盖 my_mapping子类化并覆盖 DefaultDict[str, int].__init__(self, five, *args, **kwargs)将 class MyDefaultDict(DefaultDict[str, int]): def __new__(cls, *args, **kwargs): return super().__ne
我想做这样的事情:
from functools import partial
from typing import DefaultDict
def five() -> int:
return 5 # whatever.
MyDefaultDict = partial(DefaultDict[str,int],five)
my_mapping: MyDefaultDict = MyDefaultDict(x=4)
print(my_mapping['x'])
print(my_mapping['y'])
- 新的类型/类事物
MyDefaultDict
被声明一次并且只有一个名称。 -
MyDefaultDict
可以像类构造函数一样使用,其签名与dict
的相同,唯一的区别是您得到的是带有 {{1} 的defaultdict
}} 作为它的工厂。 -
MyPy 应该理解
five
与(或最好是其子类)MyDefaultDict
相同。这是上面代码中不起作用的部分。 - 对于我目前的使用来说是不必要的,但在一般情况下是一个不错的选择:
DefaultDict[str,int]
实际上应该具有从MyDefaultDict
继承的类属性(eg 静态方法) .
defaultdict
不合适并不奇怪。
partial
通常与 MyPy 配合不佳,充其量它会被理解为返回某种 partial
,这对于 {{1} 来说不是一个明智的类型}. (报告的实际失败是“Callable
”。)
许多其他事情似乎可以工作,但我一直无法让它们:
子类化并覆盖 my_mapping
scratch.py:9: error: Variable "scratch.MyDefaultDict" is not valid as a type
通过 MyPy。
文件“scratch.py”,第 9 行,__init__
class MyDefaultDict(DefaultDict[str,int]):
def __init__(self,*args,**kwargs):
DefaultDict[str,int].__init__(self,five,**kwargs)
类型错误:__init__
得到了意外的关键字参数“x”
子类化并覆盖 DefaultDict[str,**kwargs)
__init__()
通过 MyPy。
"__new__
";没有使用工厂函数。
将 class MyDefaultDict(DefaultDict[str,int]):
def __new__(cls,**kwargs):
return super().__new__(cls,**kwargs)
包裹起来使其看起来像一个类型
我用三个参数 KeyError: 'y'
和 partial
尝试了 type
。据我所知,这不是他们想要解决的任何问题。
我简要地研究了元类,但没有看到它们如何帮助解决这个问题。
我使用的是 python 3.8,但其他版本的答案可能可行。
有人知道这样做的正确方法吗?
解决方法
在编写上述内容时,我意识到覆盖 __init__
的不同方式会产生不同的结果。
这也不起作用:
class MyDefaultDict(DefaultDict[str,int]):
def __init__(self,*args,**kwargs):
super().__init__(self,five,**kwargs)
文件“scratch.py”,第 9 行,__init__
super().__init__(self,**kwargs)
类型错误:第一个参数必须是可调用的或无
这确实有效;最好能理解为什么:
class MyDefaultDict(DefaultDict[str,**kwargs):
super().__init__(five,**kwargs)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。