我试图通过滥用Python切片语法来动态地创建类型提示。我的愿望是能够像这样使用它:
def is_senior(r: Row["age": int, "name" : str]) -> bool:
return r.age > 35 and r.name in ['John'] and r.color == "Blue"
我希望从IDE中得到一些类型提示冲突(例如PyCharm),r.color
不存在于r
中
为此,我在使用Row[]
语法时动态生成了一个数据类。但是,这在IDE中不起作用
from dataclasses import dataclass, make_dataclass
class RowSugar:
def __getitem__(self, item):
specs = []
for col_spec in item:
specs.append((col_spec.start, col_spec.stop))
return make_dataclass("RowSpec", specs)
Row = RowSugar()
但是如果我创建一个显式的数据类
@dataclass
class DRow:
age: int
name: str
def is_senior2(row: DRow) -> bool:
return row.age > 35 and row.name in ['John'] and row.color == "Blue"
row.color
被正确地标记为不存在。
如何使r.color
显示为与row.color
类似。我应该使用像mypy
这样的东西吗?
1条答案
按热度按时间mxg2im7a1#
如果我对你的问题理解正确的话,问题是
Row
是示例(你可能也应该叫它一个小写空格的名字),而pycharm没有意识到这个属性不存在,因为它可能存在。__slots__
可以吗?你可以试试,我也可以试试,然后告诉你它对我是否有效!编辑:你能提供一个MRE,我不完全确定你的代码看起来如何
编辑2:目前我试着这样:x1c 0d1x,它似乎不工作,和一个类似的问题已经打开10年前:https://youtrack.jetbrains.com/issue/PY-10397/PyCharm-should-check-slots-before-issuing-unresolved-reference-attribute-warning无论如何,看起来pycharm不支持这个,你真正想要完成的是什么?这是一个方便的事情还是你在尝试别的东西?不过,如果你想对你的代码有更多的保护,我推荐
__slots__
!