我正在尝试创建NamedTuple的通用版本,如下所示:
T1 = TypeVar("T1")
T2 = TypeVar("T2")
class Group(NamedTuple, Generic[T1, T2]):
key: T1
group: List[T2]
g = Group(1, [""]) # expecting type to be Group[int, str]
但是,出现以下错误:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我不确定在这里我还能做些什么,或者在某种程度上这可能是键入机制中的错误。
因此,这是一个元类冲突,因为在python
3.6中键入NamedTuple
和Generic
使用不同的元类(typing.NamedTupleMeta
和typing.GenericMeta
),而这是python无法处理的。恐怕除了从tuple
值中继承和手动初始化值外,没有其他解决方案:
T1 = TypeVar("T1")
T2 = TypeVar("T2")
class Group(tuple, Generic[T1, T2]):
key: T1
group: List[T2]
def __new__(cls, key: T1, group: List[T2]):
self = tuple.__new__(cls, (key, group))
self.key = key
self.group = group
return self
def __repr__(self) -> str:
return f'Group(key={self.key}, group={self.group})'
Group(1, [""]) # --> Group(key=1, group=[""])
由于PEP
560和563,此问题已在python
3.7中修复:
Python 3.7.0b2 (v3.7.0b2:b0ef5c979b, Feb 28 2018, 02:24:20) [MSC v.1912 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import annotations
>>> from typing import *
>>> T1 = TypeVar("T1")
>>> T2 = TypeVar("T2")
>>> class Group(NamedTuple, Generic[T1, T2]):
... key: T1
... group: List[T2]
...
>>> g: Group[int, str] = Group(1, [""])
>>> g
Group(key=1, group=[''])
当然,在python 3.7中,您只能使用轻量级(且易变)但用途相似的数据类。
from dataclasses import dataclass, astuple
from typing import Generic, TypeVar, List
T1 = TypeVar('T1')
T2 = TypeVar('T2')
@dataclass
class Group(Generic[T1, T2]):
key: T1
group: List[T2]
# if you want to be able to unpack like a tuple...
def __iter__(self):
yield from astuple(self)
g: Group[int, str] = Group(1, ['hello', 'world'])
k, v = g
print(g)
尽管我没有检查过,类型检查器在python 3.7中如何处理我的解决方案/您的解决方案。我怀疑这可能不是无缝的。
我找到了另一个解决方案-制作一个新的元类
import typing
from typing import *
class NamedTupleGenericMeta(typing.NamedTupleMeta, typing.GenericMeta):
pass
class Group(NamedTuple, Generic[T1,T2], metaclass=NamedTupleGenericMeta):
key: T1
group: List[T2]
Group(1, ['']) # --> Group(key=1, group=[''])
问题内容: 我正在使用Ubuntu 16.04,该版本随附Python 2.7和Python 3.5。我已经在上面安装了Python 3.6,并通过将符号3链接到python3.6 。 然后,我使用安装了。当我检查时,virtualenv已安装在适当的位置,因此当我尝试使用它创建virtualenv时,会抛出错误: 我该怎么办? 问题答案: 我们通常用来创建一个新的virtualenv(这是我们的
问题内容: 与以前的版本不同,字典在Python 3.6中排序(至少在CPython实现下)。这似乎是一个重大更改,但只是文档中的一小段。它被描述为CPython实现细节而不是语言功能,但这也意味着将来可能会成为标准。 在保留元素顺序的同时,新的词典实现如何比旧的实现更好? 以下是文档中的文字: 现在使用PyPy率先提出的“compact”表示形式。与Python 3.5相比,新dict()的内存
现在使用了Pypy首创的“紧凑”表示形式。与Python3.5相比,新的dict()的内存使用量减少了20%到25%。PEP 468(保留函数中**kwargs的顺序。)是通过这个来实现的。这个新实现的保序方面被认为是一个实现细节,不应该被依赖(这在将来可能会改变,但是在更改语言规范以强制所有当前和将来的Python实现的保序语义之前,希望在几个版本中使用这个新的dict实现;这也有助于保持与仍然
本文向大家介绍python3.6使用pickle序列化class的方法,包括了python3.6使用pickle序列化class的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python3.6使用pickle序列化class的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
本文向大家介绍Ubuntu18.04中Python2.7与Python3.6环境切换,包括了Ubuntu18.04中Python2.7与Python3.6环境切换的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Python2.7与Python3.6环境切换的具体方法,供大家参考,具体内容如下 系统支持为:Ubuntu18.04 系统默认安装:Python2.7 自己安装:Python3.
对于python及其不同版本,我有很多不理解的问题。我正在学习一门CS50网络课程,我需要pip3用于Python3.6或更高版本。情况是,我不能将pip用于Python3.6。在下,我可以找到不同的pip文件:pip、pip2、pip2.7、pip3和pip3.4。无论如何,如果我运行“pip”,我会得到消息bash: /usr/local/bin/pip:/usr/bin/python:缺陷解
本文向大家介绍python3.6使用tkinter实现弹跳小球游戏,包括了python3.6使用tkinter实现弹跳小球游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python3.6实现弹跳小球游戏的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。