使用pylint_django运行Pylint时已经有一段时间了。我包括错误回溯和有关我的环境的详细信息。
我认为我已经找到了解决方案并提交了推送请求,但是我在这里发布了问题,以防其他人遇到相同的问题。
该问题已在GitHub上发布:https://github.com/PyCQA/pylint-django/issues/284
跟踪:
Traceback (most recent call last):
File "D:\DevTools\Python38-32\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:\DevTools\Python38-32\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "D:\DevRepo\dex\venv\Scripts\pylint.exe\__main__.py", line 9, in <module>
File "d:\devrepo\dex\venv\lib\site-packages\pylint\__init__.py", line 22, in run_pylint
PylintRun(sys.argv[1:])
File "d:\devrepo\dex\venv\lib\site-packages\pylint\lint\run.py", line 344, in __init__
linter.check(args)
File "d:\devrepo\dex\venv\lib\site-packages\pylint\lint\pylinter.py", line 870, in check
self._check_files(
File "d:\devrepo\dex\venv\lib\site-packages\pylint\lint\pylinter.py", line 904, in _check_files
self._check_file(get_ast, check_astroid_module, name, filepath, modname)
File "d:\devrepo\dex\venv\lib\site-packages\pylint\lint\pylinter.py", line 930, in _check_file
check_astroid_module(ast_node)
File "d:\devrepo\dex\venv\lib\site-packages\pylint\lint\pylinter.py", line 1062, in check_astroid_module
retval = self._check_astroid_module(
File "d:\devrepo\dex\venv\lib\site-packages\pylint\lint\pylinter.py", line 1107, in _check_astroid_module
walker.walk(ast_node)
File "d:\devrepo\dex\venv\lib\site-packages\pylint\utils\ast_walker.py", line 75, in walk
self.walk(child)
File "d:\devrepo\dex\venv\lib\site-packages\pylint\utils\ast_walker.py", line 72, in walk
callback(astroid)
File "d:\devrepo\dex\venv\lib\site-packages\pylint_django\checkers\forms.py", line 47, in visit_classdef
if child.targets[0].name == 'exclude':
AttributeError: 'Subscript' object has no attribute 'name'
在彻底清除文件forms.py
并给出错误消息之后,我认为我已经设法隔离出有问题的行。仍然显示错误的文件现在仅包含以下内容:
from django import forms
from dex import models
class DataSelectionForm(forms.ModelForm):
"""
Form
"""
class Meta:
model = models.DataSelection
fields = [
"field",
]
widgets = {}
widgets["field"] = forms.CheckboxSelectMultiple
当然,我过度简化了该表单类。看来该错误是由widgets["field"] = forms.CheckboxSelectMultiple
引起的,在实际代码中,该代码是在循环创建小部件字典后在特定字段中添加其他小部件的。
如果我改用widgets = {"field": forms.CheckboxSelectMultiple}
,那么一切都很好。
有关我的配置的一些详细信息:
点冻结的结果:
astroid==2.4.2
certifi==2020.6.20
chardet==3.0.4
colorama==0.4.3
Django==2.2.14
django-activity-stream==0.9.0
django-annoying==0.10.6
django-filter==2.3.0
django-formtools==2.2
django-jsonstore==0.4.1
django-material==1.6.7
django-simple-history==2.11.0
django-viewflow==1.6.1
docutils==0.16
gunicorn==20.0.4
idna==2.10
isort==4.3.21
lazy-object-proxy==1.4.3
mccabe==0.6.1
oauthlib==3.1.0
Pillow==7.2.0
psycopg2==2.8.5
pyasn1==0.4.8
pyasn1-modules==0.2.8
pylint==2.5.3
pylint-django==2.2.0
pylint-plugin-utils==0.6
python-ldap==3.3.1
python-magic==0.4.18
python-magic-bin==0.4.14
pytz==2020.1
PyYAML==5.3.1
requests==2.24.0
requests-oauthlib==1.3.0
rope==0.17.0
six==1.15.0
sqlparse==0.3.1
toml==0.10.1
urllib3==1.25.10
wrapt==1.12.1
答案 0 :(得分:1)
虽然pylint_django
未提供修复程序,但是您可以通过避免使用类似widget["field"] = ...
的分配来解决该错误。
我想类似的代码,例如fields["field"] = "another_field_to_handle"
也会造成类似的问题。
说明:
深入研究pylint_django
的代码后,我发现了以下内容:
meta.get_children()
返回Meta
类的所有子级,在示例代码中包含字典分配。
期望的子项为Assign
类型,其在属性目标中的第一项为AssignName
类型,例如AssignName.widgets(name='widgets')
。
类似widget["field"] = forms.SomeWidget
的指令将导致Assign
的子代包含Subscript(ctx=<Context.Store: 2>, value=<Name.widgets ...>, slice=<Index ...>)
。这当然是意外的。
我已提交推送请求,并提出了建议的修订:https://github.com/PyCQA/pylint-django/pull/285