记录鸭子类型的Python参数

时间:2018-09-03 10:50:41

标签: python documentation pydoc

我有一个函数private void play() { player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { stopPlayer(); } }); player.start(); } ,希望它的参数if 3 in media_info['tracks'].keys(): local_file_info.append(media_info['tracks'][3]['Format']) else: local_file_info.append(None) 是实现foobarbaz的任何对象。

__gt__

关于如何记录这些类型的参数是否有约定?如果有问题,我正在使用Python 3.5。

1 个答案:

答案 0 :(得分:0)

对于__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

请注意,出于特定目的,不需要在foo中定义barFooAndBar(无论如何,子类挂钩都会触发),但是忽略这些方法对我来说似乎很奇怪,并且可能代码的读者。