gpt4 book ai didi

python - 如何在没有元类冲突的情况下将泛型类型与 PyQt 子类一起使用?

转载 作者:太空狗 更新时间:2023-10-29 21:53:58 60 4
gpt4 key购买 nike

我已经尝试过使用 sip 包装器类型的 abc.ABCMeta,当使用 abc.ABC 进行子类化时它工作得很好。

class QABCMeta(wrappertype, ABCMeta):
pass

class WidgetBase(QWidget, metaclass=QABCMeta):
...

class InterfaceWidget(WidgetBase, ABC):
...

class MainWidget(InterfaceWidget):
...

但它不适用于typing.Generic

class QGenericMeta(wrappertype, GenericMeta):
pass

class WidgetBase(QWidget, Generic[T], metaclass=QGenericMeta):
...

class GenericWidget(WidgetBase[float]):
...

它提出了:

line 980, in __new__
self if not origin else origin._gorg)
TypeError: can't apply this __setattr__ to sip.wrappertype object

我希望它像往常一样使用通用子类:

class TableBase(QTableWidget, Generic[T]):
@abstractmethod
def raw_item(self, row: int) -> T:
...
def data(self) -> Iterator[T]:
yield from (self.raw_item(row) for row in range(self.rowCount()))

class MainTable(TableBase[float]):
def raw_item(self, row: int) -> float:
return float(self.item(row, 1).text()) # implementation

table = MainTable()
for data in table.data():
data: float

但是数据在没有继承Generic[T]时仍然是Any

能不能用 PEP 560 解决做类型检查?

最佳答案

好吧,我找到了答案。

因为typing.Generic的元类是abc.ABC,所以它也应该基于abc.ABCMeta。但这仅适用于 Python 3.7 或更高版本。

然后,只需使用 type(QObject) 而不是 sip.wrappertype:

# -*- coding: utf-8 -*-

from abc import abstractmethod, ABC, ABCMeta
from typing import TypeVar, Generic, Iterator
from PyQt5.QtCore import QObject
from PyQt5.QtWidgets import QTableWidget

QObjectType = type(QObject)
T = TypeVar('T')


class QABCMeta(QObjectType, ABCMeta):
pass


class BaseWidget(QTableWidget, Generic[T], metaclass=QABCMeta):

@abstractmethod
def raw_item(self, row: int) -> T:
...

def data(self) -> Iterator[T]:
yield from (self.raw_item(row) for row in range(self.rowCount()))


class TestWidget(BaseWidget[float], ABC): # optional inherit ABC.

def raw_item(self, row: int) -> float:
return float(self.item(row, 1).text())


if __name__ == '__main__':
w = TestWidget()
for f in w.data():
pass

此代码适用于 PyCharm IDE,变量 f 的注释是 float

当把PyQt5改成PySide2时,也可​​以!

关于python - 如何在没有元类冲突的情况下将泛型类型与 PyQt 子类一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54635205/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com