记录鸭型的 Python 参数



我有一个函数foobar,它期望其参数baz是实现__gt____eq__的任何对象。

def foobar(baz, qux):
"""
:type baz: Any object that implements __gt__ and __eq__
"""
if baz >= qux:
return 'nice!'
return 'ouch!'

对于如何记录这些类型的参数,是否有任何约定?如果重要的话,我正在使用Python 3.5。

对于__gt____eq__来说,这有点毫无意义,因为object具有这些属性。

@timgeb:没想到说实话,很好。问题实际上是关于记录这种类型的鸭子类型,所以让我们假装不是这样?:)

在一般情况下,我想你可以给自己写一个实现__subclasshook__的ABC,然后键入该类。

from abc import ABCMeta, abstractmethod
class FooAndBar(metaclass=ABCMeta):
@abstractmethod
def foo(self):
raise NotImplementedError
@abstractmethod
def bar(self):
raise NotImplementedError
@classmethod
def __subclasshook__(cls, C):
if cls is FooAndBar:
has_foo = any('foo' in X.__dict__ for X in C.__mro__)
has_bar = any('bar' in X.__dict__ for X in C.__mro__)
if has_foo and has_bar:
return True
return NotImplemented
class Foo:
def foo(self):
pass
class FooBar:
def foo(self):
pass
def bar(self):
pass
print(isinstance(Foo(), FooAndBar)) # False
print(issubclass(Foo, FooAndBar)) # False
print(isinstance(FooBar(), FooAndBar)) # True
print(issubclass(FooBar, FooAndBar)) # True
def func(arg: FooAndBar):
pass

请注意,您的特定目的不需要在FooAndBar中定义foobar(无论如何都会触发子类钩子(,但省略这些方法对我来说看起来很奇怪,可能任何代码的读者。

最新更新