PyRight检测Django表单clean方法中cleaned_data时报错'get'不是None的已知属性的解决方法咨询
嗨,我之前也碰到过一模一样的问题!明明装了django-stubs,ORM相关的类型提示都正常,偏偏在表单的clean方法里,PyRight揪着cleaned_data说它可能是None,不让调用get方法,而且VSCode里还没这个报错,确实挺闹心的。
其实这是因为django-stubs对ModelForm.clean()方法的返回值类型注解,在某些场景下还不够完善,而PyRight本身的类型检查又比较严格,才会出现这个问题。下面给你几个亲测有效的解决办法:
显式添加类型注解
直接给cleaned_data变量指定字典类型,明明白白告诉PyRight它的类型:from django.forms import ModelForm from typing import Dict, Any class FooForm(ModelForm): def clean(self): cleaned_data: Dict[str, Any] = super().clean() start = cleaned_data.get("start_date") # 你的其他校验逻辑 return cleaned_data这种方式最直接,也符合类型提示的最佳实践,PyRight看到注解后就不会再把它当成
None了。使用类型断言或兜底处理
如果你不想额外加类型注解,也可以用两种方式处理:
第一种是用兜底值,确保即使cleaned_data是None也能拿到一个空字典:def clean(self): cleaned_data = super().clean() start = (cleaned_data or {}).get("start_date") # 其他逻辑 return cleaned_data第二种是用
assert断言,告诉PyRight这个变量肯定不是None:def clean(self): cleaned_data = super().clean() assert cleaned_data is not None, "Cleaned data shouldn't be None" start = cleaned_data.get("start_date") # 其他逻辑 return cleaned_data这两种方式都能让PyRight放松对这个变量的类型检查。
更新django-stubs到最新版本
有时候这个问题只是旧版本django-stubs的类型注解缺陷,更新到最新版可能已经修复了这个问题。你可以在终端运行:pip install --upgrade django-stubs之后再重新跑PyRight检查,说不定就没这个报错了。
另外关于VSCode不报错的问题,大概率是因为VSCode默认用的是Pylance(和PyRight同属一个技术栈,但检查策略略有不同),它对这种场景的类型推断更宽松,或者你的VSCode里的PyRight插件版本和CLI版本不一致,才导致两边的检查结果不一样。
内容来源于stack exchange

