Размещены результаты исследования подверженности кода на языке Python ошибкам, связанным с неправильным внедрением запятых в коде.
Задачи вызваны тем, что при перечислениях Python автоматом соединяет воединыжды строчки в перечне, если они не разбиты запятой, а так же обрабатывает значение, как кортеж, если после значения следует запятая.
Проведя автоматический анализ 666 GitHub-репозиториев с кодом на языке Python исследователи выявили вероятные трудности с запятыми в 5% изученных проектов.
Предстоящая ручная проверка показала, что настоящие ошибки находятся лишь в 24 репозиториях (3.6%), а другие 1.4% являются неверными срабатываниями (к примеру, запятая могла быть специально пропущена между строчками для объединения разбитых на несколько строк файловых путей, длинных хэшей, HTML-блоков либо SQL-выражений).
Примечательно, что в числе 24 репозиториев с настоящими ошибками оказались такие большие проекты, как Tensorflow, Гугл V8, Sentry, Pydata xarray, rapidpro, django-colorfield и django-helpdesk.
При этом трудности с запятыми не специфичны для Python и нередко всплывают в проектах на C/C++ (примерны недавнешних исправлений — LLVM, Mono, Tensorflow).
Главные виды изученных ошибок:
- Случайно пропущенная запятая в перечнях, кортежах и огромных количествах, приводящая к объединению строк вместо их интерпретации как отдельных значений.
К примеру, в Sentry в одном из тестов была пропущена запятая между строчками «releases» и «discover» в перечне, что привело к проверке несуществующего обработчика »/releasesdiscover», вместо раздельной проверки »/releases» и »/discover».
Иной пример — пропущенная запятая в rapidpro приводила к объединению дух различных правил в строке 572:
- Пропущенная запятая в конце определения кортежа из 1-го элемента, приводящая к тому, что в ходе присвоения будет присвоен не кортеж, а обычный тип.
К примеру, выражение «values = (1,)» приведёт к присвоению переменной кортежа из 1-го элемента, но «values = (1)» приведёт к присвоению целого типа.
Скобки в обозначенных присвоениях не влияют на определение типа и являются необязательными, а наличие кортежа определяется парсером лишь на основе наличия запятых.REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # вместо кортежа будет присвоена строка. ) }
- Обратная ситуация — излишние запятые при присвоении.
Если в конце присвоения случаем оставлена запятая, то в качестве значения вместо обычного типа будет присвоен кортеж (к примеру, если вместо «value = 1» обозначено «value = 1,»).
Источник: http://www.opennet.ru/opennews/art.shtml? num=56470