1

我目前正在重写一个程序,我将两个较旧的脚本合并为一个。我重用了大部分代码,也mypy用于新版本中的类型检查。

总是出现的是一个 mypy 错误,它在尝试从我创建的类中访问属性时具有无效的索引类型attrs

# classes.py
@attrs(on_setattr=_validate_dict)
class Config:
    defaults = attrib(
        default=Factory(dict),
        validator=_validate_dict)
    target = attrib(
        default=Factory(dict),
        validator=_validate_dict)
    source = attrib(
        default=Factory(dict),
        validator=_validate_dict)
    etl = attrib(
        default=Factory(dict),
        validator=_validate_dict)

# main.py
config = Config()
data = {
    'foo':'bar'
}
config.defaults.update(data)
# can also be
# config.default = data
# or
# setattr(
#     self,
#     defaults,
#     {x: y for (x, y) in data.items()}
# )

a = config.defaults['foo']
b = config.defaults.get('foo')

在这两种情况下,我都会收到以下消息: Invalid index type "str" for "Dict[_KT, _VT]"; expected type "_KT"

我可以跳过的唯一方法是# type: ingore在行尾手动添加。要么我没有正确使用课程,要么我监督了一些事情。

那里有人对我有提示吗?提前谢谢。

4

1 回答 1

0

使其成为官方答案:

代码没有定义属性的类型(使用注释或type参数)。因此mypy查看返回值的类型,attr.ib它根本没有任何意义(它实际上在@attr.s完成时被装饰器删除)。

可以说,如果 mypy 能更顺利地处理这个案例,那就更好了。

于 2021-01-21T11:25:03.730 回答