pycharm 使动态创建的数据类的行为与类型提示中的显式数据类类似

fnatzsnv  于 2023-06-06  发布在  PyCharm
关注(0)|答案(1)|浏览(84)

我试图通过滥用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这样的东西吗?

mxg2im7a

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__

相关问题