我的方法需要一个具有属性pattern
和函数handle
的对象。为此,我编写了一个具有这两个成员的Protocol
示例。考虑以下代码:
class Handler(typing.Protocol):
"""Handler protocol"""
pattern: re.Pattern
@staticmethod
def handle(match: re.Match) -> str:
pass
def f(obj: Handler, text: str):
output = []
for match in re.finditer(obj.pattern, text):
output.append(obj.handle(match))
return output
class MyHandler(Handler):
pattern = re.compile("hello world")
@staticmethod
def handle(match: re.Match) -> str:
return "hi there"
f(MyHandler, 'hello world, what a nice morning!')
字符串
但是,当我使用MyHandler
调用此函数时,IDE(PyCharm)会发出以下警告:
应为类型“ReplacerProtocol”,而得到的是“Type[CitationReplacer]"
当我从protocol类中删除pattern
属性时,此警告消失。当我更改协议以要求@property
或名称为pattern
的函数时,会发出相同的警告。
在Python中定义接口的正确方法是什么?
1条答案
按热度按时间6ie5vjzr1#
直接在XML协议中的pattern属性上使用@property装饰器。我使用了obj.pattern.search方法而不是re. finditer。
字符串