Перехват ошибок импорта и имен в Python во время «компиляции» - PullRequest
4 голосов
/ 23 апреля 2019

Можете ли вы поймать import / name и другие ошибки в python, используя инструмент (linting) или шаг компиляции?

Другой вариант - убедиться, что все возможные пути кода проверены(Это не всегда выполнимо, особенно для больших баз существующего кода и по другим причинам)

Вот несколько примеров.

  1. Отсутствует импорт - пойман Пилинтом, хотя как syntax error вместо import error.
def test():
    print("Time now is ..", datetime.datetime())

Вывод Пилинта:

E0602: Undefined variable 'datetime' (undefined-variable)
Импортировать подарок , но используется неверный метод.Это передает и pylint и py_compile.
from datetime import datetime
def test():
    print("Time now is ..", datetime.today2())

Редактировать: добавить еще одну опцию.

Выполнение import * показывает некоторые ошибки, но не ошибки в выражениях, которыенаходятся внутри функций.

Сообщается об этой ошибке

from datetime import datetime
print("today2", datetime.today2())

Ошибка:

Python 3.7.0 (default, Aug 22 2018, 15:22:56)
>>> from test import *
...
    print("today2", datetime.today2())
AttributeError: type object 'datetime.datetime' has no attribute 'today2'
>>>

Это не.

from datetime import datetime
def test():
    print("Time now is ..", datetime.today2())

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

В отличие от c ++, который является компилируемым языком, python является интерпретируемым языком. Что означает, что у него нет фазы компиляции. Он интерпретировал код построчно.

В соответствии с этим вы не нашли ошибки, пока не достигли их во время выполнения.

Если вы хотите, чтобы появлялись ошибки, вы должны каким-то образом указывать путь к каждой строке вашего кода. Наилучшим подходом является использование тестовых библиотек со 100% охватом тестов.

Для получения дополнительной информации посмотрите этот вопрос и ответы на него.

1 голос
/ 03 мая 2019

По моему опыту, flake8 отлично справляется с поиском пропущенных ошибок импорта и имен. Чтобы перехватить пропущенный импорт, вы не должны использовать подстановочные символы импорта, такие как «from foo import *», так как он не может угадать, какие имена будут созданы. Кроме того, он не может выполнить эти обнаружения, пока существуют синтаксические ошибки, поэтому вам нужно сначала их исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...