我使用一个简单但功能强大的类,该类的行为类似于数据库表,并带有内置的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中的错误?
答案 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。