тип подсказки магический метод __call __ () - PullRequest
0 голосов
/ 21 января 2019

Я использую простой, но мощный класс, который действует как таблица базы данных, в комплекте со встроенным методом фильтра.Вот небольшое его подмножество.

PyCharm не показывает подсказку типа для # 3.

from dataclasses import dataclass


@dataclass
class Record:
    ID: int


class Table(list):
    """Like a database table.

    Usage:
    table = Table([Record(123), ...])
    >> table.filter(123)
    Record(123)
    """
    def __call__(self, ID) -> Record:
        return self.filter(ID)

    def filter(self, ID) -> Record:
        return Table(x for x in self if x.ID == ID)[0]


table = Table([Record(123)])

table[0].               # 1. This works. ".ID" Pops up after typing the period.
table.filter(123).      # 2. This works too.
table(123).             # 3. Crickets :-(. Nothing pops up after typing the period.

Я что-то не так делаю или это ошибка в PyCharm?

1 Ответ

0 голосов
/ 21 января 2019

Проблема в том, что Table подклассы list.Если мы реализуем требуемые методы контейнера в Table вместо создания подкласса list, тогда автозаполнение работает, как и ожидалось, например:

from dataclasses import dataclass


@dataclass
class Record:
    ID: int


class Table:
    def __init__(self, items):
        ...

    def __getitem__(self, ID) -> Record:
        ...

    def __call__(self, ID) -> Record:
        return self.filter(ID)

    def filter(self, ID) -> Record:
        return Table(x for x in self if x.ID == ID)[0]


table = Table([Record(123)])
table[0].          # works
table.filter(123). # works
table(123).        # works

Я тестировал на PyCharm Professional 2018.3.2.

Вы можете просмотреть документацию здесь для получения дополнительной информации об эмуляции типов контейнеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...