Размещены результаты исследования подверженности кода на языке 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».
    В 3.6% тестированных Python-репозиториев выявлены ошибки, связанные с пропущенными запятыми
    Иной пример — пропущенная запятая в rapidpro приводила к объединению дух различных правил в строке 572:
    В 3.6% тестированных Python-репозиториев выявлены ошибки, связанные с пропущенными запятыми
  • Пропущенная запятая в конце определения кортежа из 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