Проверьте код Python на наличие ошибок

Я могу проверять файлы или модули python на наличие ошибок через некоторые библиотеки, такие как: pylint, pychecker, pyflakes и т. Д. В большинстве случаев я должен указать файл или каталог для проверки. Например:

pylint directory/mymodule.py

Это нормально, но не достаточно для меня. Я хочу проанализировать отдельный блок кода и получить все обнаруженные ошибки и предупреждения. Итак, я должен вызвать анализатор кода Python из моего собственного модуля как часть программы.

import some_magic_checker

code = '''import datetime; print(datime.datime.now)'''
errors = some_magic_checker(code)
if len(errors) == 0:
    exec(code)  # code has no errors, I can execute its
else:
    print(errors)  # display info about detected errors

Существует ли какая-либо библиотека Python, такая как Pylint или Pyflakes, которая обеспечивает функциональность для проверки кода Python без компиляции кода? Спасибо за вашу помощь.


UPD

Я постараюсь объяснить, что я имею в виду на простом примере. У меня есть одна переменная "codeString", которая содержит исходный код Python. Я должен проанализировать этот код (без создания файлов и выполнения кода, но я могу скомпилировать код) и обнаружить все предупреждения о неправильных блоках кода. Давайте заглянем внутрь модуля pyflakes и разберемся, как он работает.

В модуле "pyflakes.api" есть функция "проверка".

from pyflakes import checker
from pyflakes import reporter as modReporter
import _ast
import sys

def check(codeString, filename):
    reporter = modReporter._makeDefaultReporter()
    try:
        tree = compile(codeString, filename, "exec", _ast.PyCF_ONLY_AST)
    except SyntaxError:
        value = sys.exc_info()[1]
        msg = value.args[0]

        (lineno, offset, text) = value.lineno, value.offset, value.text

        # If there's an encoding problem with the file, the text is None.
        if text is None:
            # Avoid using msg, since for the only known case, it contains a
            # bogus message that claims the encoding the file declared was
            # unknown.
            reporter.unexpectedError(filename, 'problem decoding source')
        else:
            reporter.syntaxError(filename, msg, lineno, offset, text)
        return 1
    except Exception:
        reporter.unexpectedError(filename, 'problem decoding source')
        return 1
    # Okay, it's syntactically valid.  Now check it.
    w = checker.Checker(tree, filename)
    w.messages.sort(key=lambda m: m.lineno)
    for warning in w.messages:
        reporter.flake(warning)
    return len(w.messages)

Как видите, эта функция не может работать только с одним параметром "codeString", мы также должны предоставить второй параметр "имя файла". И это моя самая большая проблема, у меня нет никакого файла, только код Python в строковой переменной.

Pylint, Pychecker, Pyflakes и все библиотеки, что я знаю, работает только с созданными файлами. Поэтому я пытаюсь найти некоторые решения, которые не требуют ссылки на файл Python.

1 ответ

Решение

Встроенная функция "компиляция" позволяет создавать скомпилированный код или объект AST и отлавливать некоторые ошибки без создания файла и выполнения кода. Мы должны пройти '<string>' значение в качестве второго параметра, потому что код не был прочитан из файла.

>>> def execute(code_string):
>>>    output = list()
>>>    try:
>>>        tree = compile(code_string, '<string>', 'exec')
>>>    except Exception as e:
>>>        print(e)
>>>    else:
>>>        exec(tree)
>>> # Now I can check code before calling the "exec" function
>>> code_string = 'print("Hello_World!")'
>>> execute(code_string)  # All is ok
Hello_World!
>>> code_string = 'ERROR! print("Hello_World!")'
>>> execute(code_string)  # This code will not executed
invalid syntax (<string>, line 1)
Другие вопросы по тегам