>source

나는 abc.ABCMeta 를 시도했다  sip 래퍼 유형으로, abc.ABC 로 서브 클래스화할 때 잘 작동합니다. .

class QABCMeta(wrappertype, ABCMeta):
    pass
class WidgetBase(QWidget, metaclass=QABCMeta):
    ...
class InterfaceWidget(WidgetBase, ABC):
    ...
class MainWidget(InterfaceWidget):
    ...

그러나 pyzwyz에서는 작동하지 않습니다. .

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

그러나 pyzwyz  여전히 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 입니다   data 를 상속하지 않으면 .

PEP 560으로 유형 검사를 수행 할 수 있습니까?

Any

  • 답변 # 1

    글쎄요. 답을 찾았습니다.

    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
    
    
    이 코드는 변수 f 의 주석 인 PyCharm IDE에서 작동합니다   float 입니다 .

    PyQt5 변경시   PySide2 로 작동합니다!

  • 이전 r - 다른 열의 값에서 열의 모든 행을 바꾸십시오 (gsub)?
  • 다음 javascript - 왜 두 번째 버튼으로 아무것도하지 않습니까?