from typing import Protocol
from abc import abstractmethod
# ------------------
class MP1(Protocol):
name: str
class CMP1(MP1): # ok
pass
def test_mp1(mp1: MP1):
pass
test_mp1(CMP1())
# ------------------
class MP2(Protocol):
name: str = "name"
class CMP2(MP2): # ok
pass
def test_mp2(mp2: MP2):
pass
test_mp2(CMP2())
# ------------------
class MP3(Protocol):
def foo(self) -> int:
return 42
class CMP3(MP3): # ok
pass
def test_mp3(mp3: MP3):
pass
test_mp3(CMP3())
# ------------------
class MP4(Protocol):
def foo(self) -> int:
pass
class CMP4(MP4): # ok
pass
def test_mp4(mp4: MP4):
pass
test_mp4(CMP4())
# ------------------
class MP5(Protocol):
@abstractmethod
def foo(self) -> int:
raise NotImplementedError
class CMP5(MP5): # fail
pass
def test_mp5(mp5: MP5):
pass
test_mp5(CMP5())
# ------------------
class MP6(Protocol):
@abstractmethod
def foo(self) -> int:
raise NotImplementedError
class CMP6(MP6): # ok
@abstractmethod
def bar(self) -> int:
raise NotImplementedError
def test_mp6(mp6: MP6):
pass
test_mp6(CMP6())
# ------------------
class MP7(Protocol):
@abstractmethod
def foo(self) -> int:
raise NotImplementedError
class PMP7(MP7, Protocol): # ok
def bar(self) -> int:
pass
PMP7()