如何使用静态检查来确保对象具有特定的 method/attribute?
How can I use static checking to ensure an object has a certain method/attribute?
有什么方法可以注释函数以确保传递给函数的对象具有特定的方法或属性,但我不关心它的实际类型吗?
Pycharm 在内部使用类似于 {b}
的语法来指示 methods/attributes 它推断的对象所需的内容,但这似乎无效 Python语法:
def func(a: {b}): # Error
a.b = 1
有没有办法让类型检查器辅助duck typing,这里我只关心methods/attributes对象有什么,不关心对象的类型是什么,哪里不能修改我要检查的类型?
Protocol
s可以用。我在这里记录它是因为我发现这是一个很难搜索的主题;特别是检查属性是否存在。
为了确保属性的存在:
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
后的类型提示。该行必须在语法上有效,并且类型必须与所检查属性的推断类型相匹配。如果你关心 foo
的存在而不是它的类型,typing.Any
可以用作占位符。
同理,检查方法也可以这样:
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
完成的。
有什么方法可以注释函数以确保传递给函数的对象具有特定的方法或属性,但我不关心它的实际类型吗?
Pycharm 在内部使用类似于 {b}
的语法来指示 methods/attributes 它推断的对象所需的内容,但这似乎无效 Python语法:
def func(a: {b}): # Error
a.b = 1
有没有办法让类型检查器辅助duck typing,这里我只关心methods/attributes对象有什么,不关心对象的类型是什么,哪里不能修改我要检查的类型?
Protocol
s可以用。我在这里记录它是因为我发现这是一个很难搜索的主题;特别是检查属性是否存在。
为了确保属性的存在:
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
后的类型提示。该行必须在语法上有效,并且类型必须与所检查属性的推断类型相匹配。如果你关心 foo
的存在而不是它的类型,typing.Any
可以用作占位符。
同理,检查方法也可以这样:
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
完成的。