提示__call __()魔术方法的类型

时间:2019-01-21 02:43:57

标签: python python-3.x pycharm

我使用一个简单但功能强大的类,该类的行为类似于数据库表,并带有内置的filter方法。这是其中的一小部分。

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 :(得分:0)

问题似乎是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上进行了测试。

有关模拟容器类型的其他信息,您可以参阅文档here