为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2023-10-06 10:59:12
有没有办法可以注释函数以确保传递到函数中的对象具有特定的方法或属性,但我不关心它的实际类型?Pycharm 内部使用的语法看起来像是{b}指示对象需要哪些方法/属性,但这似乎不是有效的 Python 语法:def func(a: {b}):  # Error     a.b = 1有没有办法让类型检查器协助鸭子类型,我只关心对象有什么方法/属性,而不关心对象的类型是什么,并且我无法修改我想要检查的类型?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

Protocol可以使用。我在这里记录它是因为我发现这是一个很难搜索的主题;特别是检查属性是否存在。

为了确保属性的存在:


from typing import Protocol


class HasFoo(Protocol):     # Define what's required

    foo: int


class Foo:                  # This class fulfills the protocol implicitly

    def __init__(self):

        self.foo = 1


class Bar:

    def __init__(self):     # This class fails to implicitly fulfill the protocol

        self.bar = 2


def foo_func(f: HasFoo):

    pass


foo_func(Foo())             # Type check succeeds

foo_func(Bar())             # Type check fails

请注意 后面的类型提示foo。该行必须在语法上有效,并且类型必须与所检查属性的推断类型相匹配。typing.Any如果您关心 的存在foo而不是其类型,则可以用作占位符。


同样,检查方法也可以这样做:


class HasFoo(Protocol):

    def foo(self):

        pass


class Foo:

    def foo(self):

        pass

    

class Bar:

    def bar(self):

        pass


def func(f: HasFoo):

    pass


func(Foo())             # Succeeds

func(Bar())             # Fails

类型检查是通过Pycharm 2020.2.2.



查看完整回答
反对 回复 2023-10-06
  • 1 回答
  • 0 关注
  • 51 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信