Документирование Python-параметров, которые имеют тип утка - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть функция 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, если это имеет значение.

1 Ответ

0 голосов
/ 03 сентября 2018

Это немного бессмысленно для __gt__ и __eq__, потому что object имеет эти атрибуты.

@ timgeb: Не подумал об этом, если честно, хорошая мысль. Вопрос действительно в том, чтобы задокументировать этот тип утки, так что давайте представим, что это не так? :)

В общем случае, я полагаю, вы можете написать себе азбуку, которая реализует __subclasshook__, а затем напечатать этот класс.

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 и bar в FooAndBar не требуется для вашей конкретной цели (в любом случае срабатывает подкласс), но пропуск методов будет выглядеть очень странно для меня, и, вероятно, для любого читателя кода.

...