Есть ли Python (3) lint для имен переменных, таких как «len» (встроенные функции/зарезервированные слова и т. д.)

Меня ужалил этот один (с использованием len в аргументе на вызов метода), затем определение списка и выполнение над ним len, что дает:

def fun(len):
  a = []
  ...
  len(a)

>>>TypeError: 'int' object is not callable

Есть ли Python3 lint для VS Code IDE, который вы можете настроить для отчета о переменных, не являющихся зарезервированными словами/встроенными функциями? Или маскирование/перезапись вообще. Я не ожидал такого поведения.

Поразмыслив, я понял, что особенность Python состоит в том, что вы можете передавать функции в качестве аргументов, отсюда и двойной синтаксис len и len(). Но это, конечно, застало меня врасплох!

Lint, похоже, сообщает о таких вещах, как неиспользуемые переменные.

Кажется непоследовательным, что он также не предоставляет отчеты по маске имени из коробки.

Если это возможно, может кто-нибудь посоветовать, как настроить его в VS Code?

Среда:

  • Код VS: Версия 1.23.1
  • Питон 3.6.5
  • Расширение Python 2018.4.0
  • Microsoft Windows Server 2012 RC2.

person JGFMK    schedule 30.05.2018    source источник
comment
Может кто-нибудь объяснить, почему люди предлагают закрыть это?   -  person JGFMK    schedule 30.05.2018
comment
len — это имя функции, и вы используете аргумент, для которого len теперь будет иметь тип аргумента, который вы вводите fun, который, как мы видим, является целым числом, является плохой практикой программирования для использования зарезервированных имен в качестве имен переменных .   -  person eyllanesc    schedule 30.05.2018
comment
Верно. Теперь я это знаю... Но я спрашиваю, есть ли средство проверки ворса, которое пометит это, если вы не знакомы с этими вещами как новичок в Python.   -  person JGFMK    schedule 30.05.2018
comment
Конечно, я знаю о функции. Но я не ожидал, что Python молча перезапишет его, когда я объявлю переменную, я ожидал некоторых предупреждений обратной связи IDE.   -  person JGFMK    schedule 30.05.2018
comment
Странно, существующий линтинг «зациклен» на неиспользуемых переменных, почему это не может быть то же самое для «зарезервированных слов»? (python.org/dev/peps/pep-0008) Отдельный отсутствие преемственности   -  person JGFMK    schedule 30.05.2018
comment
заключается в том, что это не зарезервированное слово, а имя функции.   -  person eyllanesc    schedule 30.05.2018
comment
Конечно - семантика... но встроенные функции я бы тоже считал зарезервированными. Когда вы добавляете больше модулей, вы ожидаете, что будут существовать дополнительные зарезервированные/ключевые слова.   -  person JGFMK    schedule 30.05.2018
comment
Думаю, я бы перефразировал, не ожидая, что Python будет молча перезаписывать... , точнее говоря, я ожидаю, что анализатор, встроенный в IDE, выявит проблемы.   -  person JGFMK    schedule 30.05.2018
comment
@JGFMK Не уверен, почему за это так сильно минусуют/отмечают. Да, вы переопределяете встроенную функцию в рамках своей функции, но, похоже, именно об этом ваш вопрос... См. мой ответ о том, как автоматически предупреждать вас о таких случаях с помощью Pylint.   -  person Samuel Dion-Girardeau    schedule 30.05.2018
comment
Ваш заголовок, вероятно, оскорбляет людей (не знаю почему) из-за тривиальной ошибки. Если бы вы просто попросили lint пометить зарезервированные ключевые слова в VS Code, это было бы лучше, исходя из моего ограниченного опыта.   -  person percusse    schedule 30.05.2018


Ответы (2)


Следуя ответу @Samuel Dion-Girardeau

  1. Похоже, что VS Code не использует эти коды напрямую. Скорее он определяет W0622 с более описательным ключом здесь. redefined-builtin в данном случае.
  2. В настройках VS Code (Файл>Настройки>Настройки) я вижу:
    2.1 python.linting.pylintUseMinimalCheckers": true
    2.2 "python.linting.pylintArgs": []

2.1 соответствует этому см. здесь

   --disable=all --enable=F,E,unreachable,duplicate-key,unnecessary-semicolon,global-variable-not-assigned,unused-variable,binary-op-exception,bad-format-string,anomalous-backslash-in-string,bad-open-mode

В том же месте

Если вы указываете значение в pylintArgs или используете файл конфигурации Pylint, то pylintUseMinimalCheckers неявно устанавливается в false.

  1. Из этого следует, что мне нужно добавить:
    3.1 redefined-builtin к --enable части "python.linting.pylintArgs": []
    Итак, мы получаем:
    3.2 python.linting.pylintUseMinimalCheckers": false
    (из этого следует, что эта часть не требуется.. .)
    3.3 "python.linting.pylintArgs": [ "--disable=all", "--enable=F,E,unreachable,duplicate-key,unnecessary-semicolon,global-variable-not-assigned,unused-variable,binary-op-exception,bad-format-string,anomalous-backslash-in-string,bad-open-mode,redefined-builtin"]

(Я копирую и вставляю из НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ПО УМОЛЧАНИЮ в ПОЛЬЗОВАТЕЛЬСКИЕ НАСТРОЙКИ).

Затем применил туда изменения, обязательно добавив запятую между парами ключ/значение.


Сноска: недавно я устанавливал это и на экземпляре Amazon.

Я забыл, что вам также нужно запустить pip install pylint См. здесь.

person JGFMK    schedule 30.05.2018
comment
Это стоило сделать. Обнаружил, что я также непреднамеренно использовал «id» в качестве переменной. - person JGFMK; 30.05.2018
comment
Также кажется, что VSCode пытается дать вам визуальную подсказку, делая текст желтым, когда это функция (например, встроенные модули docs.python.org/3/library/functions.html тоже).- Никогда не складывал два и два. Дох! - person JGFMK; 30.05.2018
comment
У меня также был модуль под названием globals, который я тоже переименовал и отрефакторил. W0622 определенно полезен. Хотелось бы, чтобы это было по умолчанию. Действительно полезно при изучении веревок с Python. - person JGFMK; 30.05.2018

Вы можете использовать Pylint, чтобы проверить это.

Он имеет специальный код предупреждения W0622 для встроенного переопределения (см. список все коды ошибок)

Чтобы настроить его в Visual Studio Code, вы можете следовать официальному руководству: Linting Python in VS Code< /а>

person Samuel Dion-Girardeau    schedule 30.05.2018