Если вы думаете, что нашли ошибку в Python, что дальше? Я проведу вас через процесс отправки патча, чтобы вы могли избежать его ловушек и найти кратчайший путь к участию в Python!
Это последний пост в серии из трех частей. В Night of the Living Thread я исправил ошибку в поточной реализации Python, чтобы потоки не превратились в зомби после разветвления. В Dawn of the Thread я сражался с нитями зомби в Python 2.6. Теперь, в ужасающем заключении, я возвращаюсь к исходному исправлению и отправляю его основной команде Python. Последняя надежда человечества состоит в том, что мы сможем принять патч и остановить нити зомби … пока не стало слишком поздно.
Действие начинается, когда я открываю ошибку в багтрекере Python . Задача состоит в том, чтобы сделать демонстрацию ошибки. Мне нужно убедить мир, что я не сумасшедший: мертвые действительно поднимаются и ходят по земле! К счастью, у меня есть короткий сценарий из Ночи Живой Нити, который ясно показывает процесс зомбирования.
Далее я должен исправить ошибку и отправить патч. Я запутался здесь, так как ошибка в Python 2.7 и 3.3: я должен представить исправления для обеих версий? Нужно сделать клонирование исходного кода Python:
hg clone http://hg.python.org/cpython
Я исправил ошибку на кончике ветки по умолчанию. Документ « Жизненный цикл патча» в Руководстве разработчика по Python говорит мне сделать патч с помощью hg diff
. Я прикрепляю его к сообщению об ошибке, нажимая кнопку «Выбрать файл», а затем «Отправить изменения».
После этого Руководство разработчика Python больше не используется. Мерзость, с которой я столкнусь, не описана ни в одном руководстве: средство отслеживания ошибок Python — это версия Roundup, взломанная на куски и сшитая вместе с инструментом для проверки кода под названием Rietveld. Получающийся в результате испорченный кошмар покрыт струпьями, швами и гнойными ранами. Это отвратительный монстр Франкенштейна. (И я думал, что это был только фильм про зомби.)
Когда я загружаю патч в трекер ошибок Roundup, он переваривается и выплевывается в инструмент для проверки кода, Rietveld. Это выглядит так , поэтому разработчик ядра Python может критиковать мое исправление. Шарль-Франсуа Натали мой рецензент. Он предлагает более понятное исправление, о котором вы можете прочитать в моем предыдущем посте , и показывает, как улучшить мой юнит-тест.
К сожалению, проходит неделя, прежде чем я узнаю, что он просмотрел мой патч. Я продолжаю посещать проблему в Раундапе, ожидая увидеть там комментарии, но я не смотрю, где я должен быть: в Раундапе есть небольшая синяя ссылка, которая говорит «обзор», которая ведет к Ритвельду. Вот куда я должен пойти, чтобы увидеть обратную связь. Драгоценное время потеряно, поскольку полчища зомби-нитей продолжают разрушать пейзаж.
Что еще хуже, моя учетная запись Gmail считает, что уведомления Ритвельда являются спамом. Оказывается, что когда-то спамеры взламывали систему отслеживания ошибок и в прошлом отправляли спам, поэтому Gmail быстро характеризует все сообщения из bugs.python.org как спам. Я перезаписываю спам-фильтр Gmail новым фильтром:
После внесения изменений, предложенных Шарлем-Франсуа, я пытаюсь заново загрузить свой патч. Нажатие «Добавить еще один набор исправлений» в Rietveld не работает: оно показывает страницу с TypeError и трассировкой. Поэтому я следую инструкциям, чтобы загрузить патч, используя upload.py
скрипт из командной строки, и это тоже вызывает исключение. Я даже не могу взывать о помощи: нажать «ответить», чтобы добавить комментарий в Rietveld, не удается . Я дрожу от страха.
Как раз, когда гибель человечества кажется неизбежной, я нахожу выход: оказывается, я должен загрузить свой новый патч в качестве дополнительного приложения к проблеме в Сводке новостей. Затем Roundup после некоторой задержки применяет его к проверке кода в Rietveld. Наконец, я могу ответить на возражения Шарля-Франсуа, и он принимает мой патч! Сводка новостей сообщает мне, когда он применяет мои изменения к веткам 2.7, 3.3 и по умолчанию .
С наступлением темноты я размышляю над тем, как вклад в Python принес мне пользу, несмотря на ужас. Во-первых, я узнал несколько вещей о Python. Я узнал, что каждый модуль в стандартной библиотеке импортирует свои зависимости, как в этом примере, из threading.py:
from time import time as _time, sleep as _sleep
Когда вы выполняете оператор вроде from threading import *
, Python импортирует только те имена, которые не начинаются с подчеркивания. Таким образом, переименование импортированных элементов — это хороший способ контролировать, какие имена экспортирует модуль по умолчанию, альтернатива __all__
списку.
Процесс обзора кода также научил меня addCleanup () , который иногда является более хорошим способом очистки после теста, чем любой из них tearDown
или блок try / finally. И я узнал, что ошибки параллелизма легче воспроизвести в Python 2 с sys.setcheckinterval(0)
и в Python 3 с sys.setswitchinterval(1e-6)
.
Но главное преимущество участия в Python — это удовлетворение и гордость, которые я получаю: Python — мой любимый язык. Я люблю это, и я спас его от зомби. Героизм — это его собственная награда.