【问题标题】:Pylint-Django: AttributeError: 'Subscript' object has no attribute 'name'Pylint-Django:AttributeError:“下标”对象没有属性“名称”
【发布时间】:2020-08-06 22:21:45
【问题描述】:

使用 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},那么一切都很好。

关于我的配置的一些细节:

  • 操作系统:Windows 10 Pro x64
  • 点数:19.2.3
  • Python:3.8.2

点冻结结果:

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

【问题讨论】:

    标签: python pylint


    【解决方案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 这样的指令将产生一个包含Subscript(ctx=&lt;Context.Store: 2&gt;, value=&lt;Name.widgets ...&gt;, slice=&lt;Index ...&gt;)Assign 子级。这当然是出乎意料的。

    我已提交带有建议修复的推送请求:https://github.com/PyCQA/pylint-django/pull/285

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 2020-01-09
      • 2023-03-03
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多