如何使用静态检查来确保对象具有特定的方法/属性?

有没有办法可以注释函数以确保传递到函数中的对象具有特定的方法或属性,但我不关心它的实际类型?

Pycharm 内部使用的语法看起来像是{b}指示对象需要哪些方法/属性,但这似乎不是有效的 Python 语法:

def func(a: {b}):  # Error
    a.b = 1

有没有办法让类型检查器协助鸭子类型,我只关心对象有什么方法/属性,而不关心对象的类型是什么,并且我无法修改我想要检查的类型?


偶然的你
浏览 87回答 1
1回答

喵喔喔

Protocol可以使用。我在这里记录它是因为我发现这是一个很难搜索的主题;特别是检查属性是否存在。为了确保属性的存在:from typing import Protocolclass HasFoo(Protocol):     # Define what's required    foo: intclass Foo:                  # This class fulfills the protocol implicitly    def __init__(self):        self.foo = 1class Bar:    def __init__(self):     # This class fails to implicitly fulfill the protocol        self.bar = 2def foo_func(f: HasFoo):    passfoo_func(Foo())             # Type check succeedsfoo_func(Bar())             # Type check fails请注意 后面的类型提示foo。该行必须在语法上有效,并且类型必须与所检查属性的推断类型相匹配。typing.Any如果您关心 的存在foo而不是其类型,则可以用作占位符。同样,检查方法也可以这样做:class HasFoo(Protocol):    def foo(self):        passclass Foo:    def foo(self):        pass    class Bar:    def bar(self):        passdef func(f: HasFoo):    passfunc(Foo())             # Succeedsfunc(Bar())             # Fails类型检查是通过Pycharm 2020.2.2.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python