Второй пилот GitHub: Летайте с Python со скоростью мысли
Оглавление
- Начало работы с GitHub Copilot на Python
- Синтезировать код на Python из естественного Языка
- Получайте еще более разумные предложения по завершению кода
- Практикуйтесь в Парном Программировании с Виртуальным Собеседником
- Избавьтесь от переполнения стека для мгновенных контекстно-зависимых решений
- Рассмотрим аргументы против использования второго пилота GitHub
- Заключение
GitHub Copilot - это захватывающая новая технология, которая обещает предоставить вашему редактору кода виртуального помощника, работающего на базе искусственного интеллекта, и это когда он был представлен широкой публике, это вызвало серьезные споры. Python входит в число языков, которые особенно хорошо поддерживаются этим инструментом. Прочитав это руководство, вы поймете, является ли GitHub Copilot рискованным решением, простым трюком или настоящим прорывом в разработке программного обеспечения.
В этом руководстве вы узнаете, как:
- Установите расширение GitHub Copilot в свой редактор кода
- Преобразуйте описание задачи на вашем естественном языке в рабочий код
- Выберите один из нескольких вариантов интеллектуальное завершение кода предложения
- Исследуйте незнакомые фреймворки и языки программирования
- Научите второго пилота GitHub пользоваться вашим пользовательским API
- Выполняйте разработку на основе тестирования с помощью виртуального парного программиста в режиме реального времени
Чтобы продолжить работу с этим руководством, вам необходимо иметь личную учетную запись на GitHub и редактор кода, такой как Visual Studio Code или интегрированная среда разработки, такая как PyCharm.
Скачать бесплатно: Нажмите здесь, чтобы скачать бесплатную шпаргалку с сочетаниями клавиш, которая позволяет еще быстрее программировать с помощью GitHub Copilot.
Начало работы с GitHub Copilot на Python
GitHub Copilot - это первый коммерческий продукт, основанный на Кодексе OpenAI система, которая может переводить естественный язык в код более чем на дюжине языков программирования в режиме реального времени. Сам OpenAI Codex является потомком модели языка глубокого обучения GPT-3. Нейронная сеть в Codex была обучена как на основе текста, так и на сотнях миллионов общедоступных репозиториев кода, размещенных на GitHub.
примечание: Вы можете узнать больше о ОПС-3, а также слушать эпизод 121 реального питона подкаст, с данными ученый Джоди Берчелл.
GitHub Copilot понимает несколько языков программирования и множество других человеческих языков, что означает, что вы не ограничены только английским. Например, если для вас испанский является родным, вы можете общаться с GitHub Copilot на своем родном языке.
Изначально продукт был доступен только в качестве технического просмотра для избранной группы людей. Недавно это изменилось, и сегодня любой желающий может ощутить невероятную мощь искусственного интеллекта в своих редакторах кода. Если вы хотите взять его на тест-драйв, вам понадобится подписка на GitHub Copilot.
Подпишитесь на GitHub Copilot
Чтобы включить GitHub Copilot, перейдите в настройки выставления счетов в своем профиле на GitHub и прокрутите вниз, пока не увидите соответствующий раздел. К сожалению, для большинства пользователей эта услуга не бесплатна. На момент написания статьи стоимость услуги составляла десять долларов в месяц или сто долларов в год при предварительной оплате. Вы можете воспользоваться шестидесятидневным пробным периодом, ничего не платя, но только после предоставления вашей платежной информации.
Примечание: Обязательно отмените неоплачиваемый тарифный план до истечения срока его действия, чтобы избежать нежелательных платежей!
Студенты и , занимающиеся сопровождением с открытым исходным кодом, могут получить бесплатную подписку на GitHub Copilot. Если вам повезет, то после включения сервиса вы увидите следующую информацию:
Статус выставления счета второму пилоту на GitHub
Раз в год GitHub будет проверять ваш статус на основании подтверждения академической успеваемости, такого как фотография вашего школьного удостоверения личности или адреса электронной почты в домене .edu, или вашей активности в одном из популярные репозитории с открытым исходным кодом.
Для получения подробных инструкций по настройке вашей подписки на GitHub и управлению ею следуйте инструкциям, приведенным в официальной документации. Далее вы узнаете, как установить расширение GitHub Copilot для Visual Studio Code. Если вы предпочитаете использовать GitHub Copilot с PyCharm вместо этого, перейдите к узнайте, как.
Установите расширение Visual Studio Code
Поскольку Microsoft владеет GitHub, неудивительно, что их редактор кода Visual Studio стал первым инструментом, получившим поддержку GitHub Copilot. Существует несколько способов установки расширений в Visual Studio Code, но самый быстрый из них, вероятно, заключается в вызове панели Быстрого открытия с помощью Ctrl+P или Cmd+P, а затем введите следующую команду:
ext install GitHub.copilot
Когда вы подтвердите это, нажав Введите, программа установит расширение и предложит вам перезагрузить редактор после этого.
Кроме того, вы можете найти значок Расширения в Панели действий, расположенной в левой части окна, и попробовать выполнить поиск для расширения GitHub Copilot на платформе Visual Studio Marketplace:
Расширение GitHub Copilot для Visual Studio Code
Вы также можете напрямую отобразить представление Расширений в Visual Studio Code, используя соответствующее сочетание клавиш.
После завершения установки Visual Studio Code попросит вас войти в GitHub, чтобы предоставить ему доступ к вашему профилю на GitHub, который требуется для вашего нового расширения:
Авторизовать GitHub для VS Code
Visual Studio Code должен знать, кто вы такой, чтобы подтвердить статус вашей подписки на GitHub Copilot. Однако предоставление доступа к вашему профилю на GitHub также позволит редактору читать ваши личные репозитории. Если вы передумаете, вы можете отозвать эту авторизацию в любое время, перейдя в настройки своего профиля на GitHub и найдя GitHub для VS Code в Авторизованных приложениях OAuth.
Примечание: Ознакомьтесь с официальным Руководством по началу работы с GitHub Copilot в Visual Studio Code, если вы застряли на каком-либо этапе.
Чтобы сделать работу с GitHub Copilot в Visual Studio Code еще более продуктивной, вот наиболее распространенные сочетания клавиш, которые стоит запомнить:
| Action | Windows / Linux | macOS |
|---|---|---|
| Trigger inline suggestions | Alt+\ | Option+\ |
| See the next suggestion | Alt+] | Option+] |
| See the previous suggestion | Alt+[ | Option+[ |
| Accept a suggestion | Tab | Tab |
| Dismiss an inline suggestion | Esc | Esc |
| Show all suggestions in a new tab | Ctrl+Enter | Ctrl+Enter |
Если у вас возникнут проблемы с использованием стандартных сочетаний клавиш, попробуйте определить свои собственные привязки клавиш в Visual Studio Code. Это может быть особенно полезно, если вы работаете с клавиатурой с раскладкой, отличной от американской.
Иногда предложения второго пилота GitHub могут вам помешать. Если это так, то вы можете отключить их глобально или для определенного языка программирования, нажав на значок расширения в правом нижнем углу окна редактора:
Значок второго пилота GitHub в коде Visual Studio
Вот и все! Вы готовы начать использовать расширение GitHub Copilot в Visual Studio Code. Но если вы предпочитаете использовать GitHub Copilot с PyCharm, читайте дальше, чтобы узнать, как это сделать.
Установите плагин для PyCharm
PyCharm - это одна из многих популярных интегрированных сред разработки, предоставляемых JetBrains и использующих общий плагин Copilot для GitHub. Вы можете установить этот плагин, открыв Настройки в вашей IDE и выбрав Плагины из списка опций. Затем на вкладке Marketplace найдите плагин GitHub Copilot и нажмите кнопку Установить рядом с ним:
Плагин GitHub Copilot для PyCharm
После установки плагина вам будет предложено перезапустить IDE. Когда вы это сделаете, вам нужно будет войти в GitHub, выбрав Инструменты в меню PyCharm, затем Второй пилот GitHub и Войдите на GitHub:
Меню входа на GitHub в PyCharm
Это сгенерирует псевдослучайный код устройства, который вы должны скопировать и вставить на страницу Активации устройства в вашем веб-браузере, на который вы перейдете после входа на GitHub:
Активация устройства на GitHub
Как и в случае с Visual Studio Code, вам потребуется авторизовать плагин PyCharm, чтобы подтвердить свою личность и соответствующий статус подписки на GitHub Copilot. Однако PyCharm использует GitHub API вместо токена OAuth, поэтому процесс авторизации выглядит немного по-другому:
Авторизовать GitHub для PyCharm
Обратите внимание, что предоставление доступа к вашему профилю на GitHub позволит плагину получать информацию о вашем профиле, такую как адрес электронной почты, и читать ваши личные репозитории. Если вы передумаете, то вы можете отозвать эту авторизацию в любое время, перейдя в настройки своего профиля на GitHub и найдя Плагин GitHub Copilot в Авторизованных приложениях на GitHub.
Примечание: Ознакомьтесь с официальным Руководством по началу работы с GitHub Copilot в среде IDE JetBrains, если вы застряли на каком-либо этапе.
Чтобы сделать работу с GitHub Copilot в PyCharm еще более продуктивной, вот наиболее распространенные сочетания клавиш, которые стоит запомнить:
| Action | Windows / Linux | macOS |
|---|---|---|
| Trigger inline suggestions | Alt+\ | Option+\ |
| See the next suggestion | Alt+] | Option+] |
| See the previous suggestion | Alt+[ | Option+[ |
| Accept a suggestion | Tab | Tab |
| Dismiss an inline suggestion | Esc | Esc |
| Show all suggestions in a new tab | Alt+Enter | Alt+Enter |
Иногда автоматическое завершение работы второго пилота на GitHub может помешать вам. Если это так, то вы можете отключить их глобально или для определенного языка программирования, нажав на значок плагина в правом нижнем углу окна редактора:
Значок второго пилота GitHub в PyCharm
Вот и все! Вы готовы начать использовать плагин GitHub Copilot в PyCharm.
Передайте бразды правления второму пилоту GitHub
Теперь пришло время убедиться, что GitHub Copilot работает должным образом либо в Visual Studio Code, либо в PyCharm. Чтобы проверить, работает ли GitHub Copilot должным образом в вашем редакторе кода Visual Studio, создайте новый текстовый файл, выберите Python в качестве базового языка программирования и начните писать образец сигнатуры функции, например hello():
Как только вы введете двоеточие (:) в конце первой строки, чтобы ввести новый блок кода, GitHub Copilot заполнит за вас текст предлагаемой функции. Пока вы не примете его, нажав Tab, или не отклоните с помощью Esc, оно будет отображаться серым шрифтом. Предлагаемый код вызывает функцию print() для отображения текста Hello World на экране в этом случае. Хотя это и не было впечатляющим, оно подтверждает, что второй пилот GitHub действительно работает правильно.
Примечание: Заметили ли вы, как быстро расширение заполнило текст вашей функции? Команда инженеров, создающая GitHub Copilot, приложила много усилий для обеспечения низкой задержки приведенных предложений для улучшения работы разработчиков.
Работа с GitHub Copilot в PyCharm практически такая же, как и в других редакторах кода. Чтобы убедиться в успешности установки плагина, попробуйте другой пример. Начните писать сигнатуру функции, название которой может указывать на то, что вы хотите сложить два числа вместе, например add(a, b):
Конечно же, GitHub Copilot дает очень разумное предложение, которое возвращает сумму a и b. Обратите внимание на разницу между возвратом значения из функции и выводом результата на экран. Ваш умный виртуальный ассистент может определить назначение функции по ее названию и аргументам.
Примечание: Справедливости ради стоит сказать, что в GitHub Copilot нет присущей ему магии. Он был обучен на огромном количестве высококачественных данных, что позволило ему выбрать наиболее вероятный результат на основе того, что он видел до сих пор в вашем файле или проекте. Поскольку инструмент не может понять ваш код, он не всегда правильно выполняет эти предложения.
В оставшейся части этого руководства вы рассмотрите несколько практических примеров использования GitHub Copilot в повседневных задачах по разработке программного обеспечения. Вы узнаете, как поднять свою производительность на совершенно новый уровень, получая мгновенные предложения по коду, адаптированные к вашим потребностям в программировании.
Синтезировать код Python из естественного языка
Поскольку второй пилот GitHub был обучен естественному языку, а также отборным примерам различных языков программирования, он, похоже, понимает оба домена. Таким образом, вполне возможно объяснить абстрактную проблему Copilot на GitHub, используя обычный английский или другой естественный язык, и ожидать, что он сгенерирует соответствующий код на нужном языке программирования.
Лежащая в основе модель машинного обучения также способна делать обратное — то есть объяснять фрагмент кода на естественном языке или даже переводить с одного языка программирования на другой. Представьте, насколько это могло бы быть полезно новичкам и творческим личностям, у которых есть представление о том, чего они хотят достичь, но которые еще не освоили компьютерное программирование.
Сейчас вы увидите, как этот перевод между человеческим и компьютерным языками выглядит на практике.
Используйте комментарий на Python для описания проблемы
Хотя такие влиятельные фигуры в мире программирования, как Роберт К. Мартин, считают комментарии к коду анти-шаблоном, комментарии иногда могут быть полезно объяснить , почему определенный фрагмент кода выглядит именно так, как он выглядит. Обычно вы пишете комментарии для себя будущего или своих товарищей по команде, работающих над той же кодовой базой.
Когда вы добавляете GitHub Copilot, это становится еще одной целевой аудиторией, которая может читать комментарии к вашему коду. Рассмотрим следующий однострочный комментарий на Python, который описывает классическую программу Hello, World!:
# Print "Hello, World!"
После ввода этого комментария в свой редактор кода вы заметите, что GitHub Copilot не распознает его автоматически. Если вы решите связаться с ним через комментарии, вам необходимо открыть боковую панель или вкладку GitHub Copilot, чтобы ознакомиться с предложениями. В качестве альтернативы вы можете начать вводить небольшой фрагмент кода, чтобы он автоматически завершился. В любом случае, при написании приведенного выше комментария у вас должен появиться следующий код на Python:
print("Hello, World!")
Это почти то же самое предложение, которое вы получили, когда проверяли расширение кода Visual Studio, написав заглушку функции hello(). Однако на этот раз вы получите несколько иной результат. Второй пилот GitHub понимает, что вы хотите рассматривать процитированный фрагмент вашего комментария как буквальный текст, а не как инструкцию.
По-видимому, это было слишком просто для второго пилота GitHub. Как насчет того, чтобы поднять планку, запросив более конкретный вывод? Например, вы можете захотеть напечатать Hello, World! на испанском наоборот:
# Print "Hello, World!" backward in Spanish.
Вы увидите новые предложения после обновления панели второго пилота GitHub в вашем редакторе. Их количество и качество могут меняться при каждом запуске второго пилота GitHub. Лучший комментарий, который вы когда-либо получите за этот конкретный комментарий, вот этот:
print("¡Hola, mundo!"[::-1])
Это впечатляет! Второй пилот GitHub добивается успеха, генерируя не только корректный, но и питонический код, который опытные питонисты написали бы сами. Предложения станут еще интереснее, если вы добавите больше комментариев.
Добавляйте больше комментариев, чтобы усложнить задачу
Использовать однострочный комментарий для описания проблемы - это нормально, но вы можете вместить в него не так много информации. К счастью, можно объединить несколько последовательных комментариев в логичную и связную историю, которую GitHub Copilot рассмотрит как единое целое. Лучше всего вставлять в каждую строку законченное предложение, не разбивая его на части, но при желании вы можете добавить явную обратную косую черту (\) в середине предложения, чтобы обозначить разрыв строки:
# Ask the user to provide a line of text.
# Scan the text for the following mildly offensive words: \
# arse, bloody, damn, dummy.
# If you find any, then replace its letters with asterisks \
# except for the first letter in each offensive word.
# Print the resulting text.
def main():
Обязательно используйте грамматически правильный язык и следите за своей пунктуацией, чтобы получить точные результаты. В этом случае вы также добавляете к комментариям сигнатуру функции, которая предоставляет дополнительные подсказки для второго пилота GitHub. Одно из предложений, которое вы получите, выглядит чертовски привлекательно:
def main():
text = input("Enter a line of text: ")
offensive_words = ["arse", "bloody", "damn", "dummy"]
for word in offensive_words:
if word in text:
text = text.replace(word, word[0] + "*" * (len(word) - 1))
print(text)
Если вы ищете объяснение того, что происходит в приведенной выше функции, ознакомьтесь с текстовым описанием в своих комментариях. Предлагаемый код очень точно отражает то, что вы там описали.
Примечание: GitHub Copilot генерирует код в различных стилях и соглашениях. Для достижения согласованности и устранения ненужных отвлекающих факторов все предложения по коду, представленные в этом руководстве, были переформатированы в соответствии с руководством по стилю PEP 8. Помните, что вы можете самостоятельно переформатировать код в большинстве редакторов одним нажатием кнопки.
Когда вы вызываете функцию main(), вы сможете оценить, насколько хорошо работает сгенерированный код:
Enter a line of text: She loves you, dummy.
She loves you, d****.
Разве это не удивительно? Вы предоставили Copilot на GitHub описание задачи на естественном языке, и оно в точности соответствовало вашему решению.
Примечание: Имейте в виду, что предложения, которые вы получите, могут отличаться от тех, что представлены в этом руководстве. Иногда требуется метод проб и ошибок, прежде чем получить желаемый результат, поэтому попробуйте немного изменить свои комментарии, если вы не сразу получите удовлетворительные результаты.
Важным моментом, который следует отметить в отношении GitHub Copilot, является то, что в нем реализован ряд фильтров для блокировки по-настоящему оскорбительных слов, непристойностей и конфиденциальной информации например, личные данные или секретные API-ключи. Он постарается никогда не выдавать вам предложений, содержащих эти элементы. Вы можете поэкспериментировать с этими фильтрами, попытавшись выманить у второго пилота GitHub чью-либо личную информацию или секреты:
| Code Fragment | Suggested Completion |
|---|---|
offensive_words = [ |
None |
# My phone number is |
# My phone number is +1 (###) ###-#### |
GITHUB_API_KEY = |
GITHUB_API_KEY = '<GITHUB_API_KEY>' |
В большинстве случаев он довольно хорошо распознает конфиденциальную информацию и выдает случайные или анонимные выходные данные. Однако механизм фильтрации несовершенен, поэтому теоретически может произойти утечка чьих-либо реальных данных из его обучающего набора данных. Согласно официальному сайту, вероятность того, что это произойдет, ничтожно мала:
Подавляющее большинство кода, который предлагает GitHub Copilot, никогда ранее не встречалось. Наше последнее внутреннее исследование показывает, что примерно в 1% случаев предложение может содержать фрагменты кода длиной более ~150 символов, которые соответствуют обучающему набору. (Источник)
Вы изучите эту возможность более подробно позже, но сейчас пришло время активизировать вашу игру, заставив GitHub Copilot решить за вас головоломку по программированию.
Решите головоломку для конкурса по программированию
Чтобы проверить истинную мощь GitHub Copilot, вы можете скопировать и вставить фрагмент текстового описания задачи по кодированию и посмотреть, как она справится. Например, почему бы вам не взять первую часть головоломки с помощью гидролокатора, посвященной первому дню календаря "Появления кода" на 2021 год::
# For example, suppose you had the following report:
#
# 199
# 200
# 208
# 210
# 200
# 207
# 240
# 269
# 260
# 263
#
# (...)
#
# In this example, there are 7 measurements that are larger \
# than the previous measurement.
#
# How many measurements are larger than the previous measurement?
def solve(measurements):
Полное описание проблемы немного длиннее и было сокращено в приведенном выше блоке кода для экономии места. Короче говоря, ваша цель - определить, во сколько раз увеличивается глубина при измерении по сравнению с предыдущим измерением. GitHub Copilot предлагает решение этой конкретной проблемы особенно хорошо, учитывая, сколько людей решали точно такую же задачу и делились своими решениями на GitHub:
def solve(measurements):
count = 0
for i in range(1, len(measurements)):
if measurements[i] > measurements[i - 1]:
count += 1
return count
Это короткий цикл, который начинается со второго элемента в списке измерений и сравнивает текущее значение с предыдущим. Если текущее значение больше, то увеличивается счетчик, который функция возвращает в конце. Это решение работает корректно и является достаточно эффективным и удобочитаемым, но не чувствуйте себя обязанным использовать предложения GitHub Copilot в буквальной форме. Это еще не все или ничего!
Вы можете редактировать код, сгенерированный Copilot на GitHub, как свой собственный. Иногда вам может не нравиться его форматирование, применяемые соглашения об именовании или определенный фрагмент логики, который вы предпочли бы переписать. В других случаях просмотр предложения может вдохновить вас на поиск более разумной альтернативы. В этом случае вы могли бы использовать это однострочное решение, например:
def solve(measurements):
return sum(1 for x, y in zip(measurements, measurements[1:]) if y - x > 0)
Вы берете сумму последовательности единиц, полученных с помощью генераторного выражения для каждой пары смежных измерений, если их разница положительна. В зависимости от вашего уровня знаний Python, вам может больше понравиться этот или предлагаемый фрагмент кода.
Теперь вы знаете, как генерировать код на естественном языке, используя один или несколько комментариев на Python. Однако, как инженер-программист, вы, вероятно, еще больше оцените контекстные подсказки по коду.
Получайте еще более разумные предложения по завершению кода
Вы можете рассматривать GitHub Copilot как интеллектуальный механизм завершения кода на стероидах, который понимает контекст вашего проекта на глубоком уровне и предоставляет наиболее подходящие для вас предложения. Когда вы достаточно долго работаете с GitHub Copilot, у вас иногда может возникнуть неприятное ощущение, что он может читать ваши мысли. В этом разделе вы увидите несколько примеров, демонстрирующих такое поведение.
Позвольте второму пилоту GitHub прочитать Ваши мысли
Допустим, вы хотите найти корни многочлена второй степени, также известного как квадратичная функция с тремя коэффициентами: 𝑎, 𝑏 и 𝑐. Вы можете выразить такую функцию в следующей алгебраической форме:

Например, конкретная функция 𝑥2 + 2𝑥 - 3 имеет такие значения коэффициентов: 𝑎 = 1, 𝑏 = 2, 𝑐 = -3,, которые вы можно использовать для вычисления так называемого дискриминанта , часто обозначаемого греческой буквой дельта:

В этом случае дискриминант функции равен шестнадцати (Δ = 16) при замене букв 𝑎, 𝑏 и 𝑐 на соответствующие значения в приведенной выше формуле. В зависимости от знака дискриминанта ваша квадратичная функция может иметь два корня, один корень или вообще не иметь корней:

Поскольку дискриминант, вычисленный ранее, является положительным числом шестнадцать, вы знаете, что ваша квадратичная функция имеет ровно два корня, которые равны 𝑥1 = -3 и 𝑥2 = 1, когда вы применяете формулы, приведенные выше. При подключении любого из них к вашей квадратичной функции в качестве значения переменной 𝑥 функция возвращает ноль. Корни функции - это точки, в которых соответствующая парабола пересекает горизонтальную ось при построении графика.
Теперь вы можете реализовать функцию Python для нахождения корней такого многочлена на основе его трех коэффициентов 𝑎, 𝑏 и 𝑐. Вы захотите следовать тому же алгоритму, вычисляя дискриминант и вычисляя правильное количество корней. Начните с написания описательной подписи функции, которая может подсказать, каковы ваши намерения:
def find_roots(a, b, c):
Через некоторое время второй пилот GitHub начнет давать вам рекомендации. Если вам повезет, то одно из них окажется на удивление точным:
def find_roots(a, b, c):
d = b**2 - 4 * a * c
if d < 0:
return None
elif d == 0:
return -b / (2 * a)
else:
return (-b + d**0.5) / (2 * a), (-b - d**0.5) / (2 * a)
Функция вычисляет дискриминант по правильной формуле и сохраняет результат во вспомогательной переменной. В зависимости от дискриминанта входа, он возвращает None, один корень стоимости, или кортежа состоящий из двух корневых значений, все рассчитали правильно. Обратите внимание, что в предлагаемом решении используется оператор возведения в степень (**) для вычисления квадратного корня из дискриминанта. Это позволяет избежать импорта функции sqrt() из модуля Python math.
Примечание: Предложения, которые вы видите, могут выглядеть по-другому, поскольку искусственный интеллект не является полностью детерминированным, поскольку он постоянно учится чему-то новому. Вы даже можете получить альтернативные результаты для идентичных входных данных, запрошенных в другое время. Это особенно актуально, если в вашем проекте есть дополнительный исходный код, из которого GitHub Copilot будет извлекать контекст.
Хорошо, но сгенерированная функция может найти только действительное число корней, если они существуют. Что, если бы вы захотели вместо этого указать все корни в области комплексных чисел? В следующем разделе вы узнаете, как давать такие подсказки второму пилоту GitHub.
Предоставьте контекст для получения более качественных предложений
Фундаментальная теорема алгебры гласит, что многочлен степени 𝑛 с комплексными коэффициентами имеет в точности 𝑛 комплексных корней . Другими словами, квадратичная функция, которая является многочленом второй степени, всегда имеет ровно два комплексных корня, даже если в реальной области их нет.
Рассмотрим функцию 𝑥2 + 1,, определитель которой отрицательный, что указывает на отсутствие корней. Вы можете подтвердить отсутствие корней графически, построив параболу функции, которая нигде не пересекает горизонтальную ось. Однако эта же функция имеет два комплексных корня, 𝑥1 = -𝑖 и 𝑥2 = 𝑖, где 𝑖 - это мнимая единица, которая равна -1, когда в квадрате: 𝑖2 = -1.
Как вы можете попросить, чтобы второй пилот GitHub изменил реализацию так, чтобы вы получали сложные корни вместо реальных?
Вам нужно добавить ограничения к задаче, предоставив GitHub Copilot некоторый контекст для использования. Например, вы можете импортировать модуль, который вы хотите использовать, или написать строку документации на Python, которая описывает ожидаемый результат на естественном языке:
import cmath
def find_roots(a, b, c):
"""Return a tuple of complex numbers."""
Здесь вы импортируете модуль cmath, который является комплексным аналогом модуля math. Он содержит функцию cmath.sqrt(), которая может вычислить квадратный корень из отрицательного числа, тогда как math.sqrt() в таком случае выдает ошибку:
>>> import cmath
>>> cmath.sqrt(-1)
1j
>>> import math
>>> math.sqrt(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
Квадратный корень из -1 в комплексной области дает мнимую единицу, которую в Python обозначают как 1j. Вы можете прочитать больше о использовании комплексных чисел в Python, чтобы узнать, почему для обозначения мнимой единицы используется буква j вместо i.
Ваша строка документации указывает ожидаемый тип данных, который должна возвращать функция. В некоторых случаях вам может потребоваться уточнить свои ожидания, добавив более конкретные слова. Например, запись “кортеж из обоих комплексных чисел” будет означать кортеж, состоящий ровно из двух элементов. С другой стороны, слово пара вместо кортеж было бы менее явным.
Примечание: Помимо строк документации, GitHub Copilot понимает подсказки по вводу в вашем коде на Python.
С добавлением этих двух небольших подсказок GitHub Copilot теперь сгенерирует другую реализацию для той же сигнатуры функции:
import cmath
def find_roots(a, b, c):
"""Return a tuple of complex numbers."""
d = (b**2) - (4 * a * c)
x1 = (-b + cmath.sqrt(d)) / (2 * a)
x2 = (-b - cmath.sqrt(d)) / (2 * a)
return x1, x2
Она вычисляет дискриминант, как и раньше, но больше не проверяет его знак. Вместо этого функция вычисляет два комплексных корня, используя функцию cmath.sqrt(), как вы и хотели. Вы можете протестировать свою новую функцию в Python REPL, чтобы проверить, правильно ли функция вычисляет оба комплексных корня:
>>> import cmath
>>> def find_roots(a, b, c):
... """Return a tuple of complex numbers."""
... d = (b**2) - (4 * a * c)
... x1 = (-b + cmath.sqrt(d)) / (2 * a)
... x2 = (-b - cmath.sqrt(d)) / (2 * a)
... return x1, x2
...
>>> find_roots(1, 0, 1) # Function f(x) = x² + 1
(1j, -1j)
>>> 1j**2 + 1
0j
>>> (-1j)**2 + 1
0j
Этот код работает блестяще! Функция x² + 1 возвращает 0 для двух комплексных корней, 1j и -1j.
Даже если это не покажется вам особенно захватывающим, вы, вероятно, будете впечатлены креативностью GitHub Copilot, которая может сэкономить вам массу времени. Далее вы будете использовать GitHub Copilot для создания основного текста класса.
Воспользуйтесь творческими возможностями GitHub Copilot
Сколько раз вы разрабатывали новый тип данных только для того, чтобы застрять на поиске нужных атрибутов или их реализации? С помощью GitHub Copilot вы можете сидеть сложа руки и расслабляться, пока он изобретает новые атрибуты, методы и свойства буквально из воздуха для вас одним нажатием кнопки. Вкладка.
Предположим, вы хотите определить класс Person, используя классы данных в Python. Вы начинаете с того, что присваиваете своему новому типу данных осмысленное имя и вводите первый атрибут, называемый .first_name:
Второй пилот GitHub немедленно извлекает оттуда информацию, предлагая следующий наиболее вероятный атрибут, .last_name, а затем .age. Однако вы знаете, что возраст человека со временем меняется, поэтому вместо этого сохраняете данные о дате его рождения. Следующее логичное предложение от GitHub Copilot - это метод, который вычисляет возраст человека на основе текущей даты. Когда вы определяете новое свойство, оно аккуратно завершает свое тело, объединяя имя и фамилию.
В итоге, это результат, который вы получаете всего несколькими нажатиями клавиш в вашем редакторе кода:
from dataclasses import dataclass
from datetime import date
@dataclass
class Person:
first_name: str
last_name: str
birth_date: date
def age(self):
return (date.today() - self.birth_date).days // 365
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
Это огромная экономия времени и повышение производительности, как ничто другое. Даже если вы знаете, что печатать, GitHub Copilot позволяет вам писать код со скоростью мысли, угадывая, о чем вы, возможно, думаете, а затем предлагая подходящее предложение, которое вы можете принять одним нажатием кнопки или клавиши.
Станьте полиглотом в программировании с персональным переводчиком
Нередко в одном файле смешиваются несколько языков, таких как HTML, CSS, JavaScript, Язык шаблонов Django и Python. К счастью, GitHub Copilot владеет более чем дюжиной языков программирования, еще большим количеством фреймворков и несколькими человеческими языками. У него нет проблем с переключением между ними на ходу в зависимости от контекста, и все это без нарушения вашего процесса.
Например, вы можете захотеть определить переменную Python для хранения SQL-запроса, который извлекает пользователей по совпадающему имени. Если вы используете правильные слова в имени своей переменной, вы должны получить разумное предложение, например, такое:
Обратите внимание, как поэтапно вы получаете отдельные строки, потому что вы определили многострочный строковый литерал, используя тройные кавычки ("""). Результат, показанный на видео выше, следующий:
query_users_by_first_or_last_name = """
SELECT * FROM users
WHERE first_name LIKE %s OR last_name LIKE %s
"""
На первый взгляд запрос выглядит нормально, хотя GitHub Copilot сделал некоторые предположения относительно имени вашей таблицы и двух столбцов для поиска. Тем не менее, приятно видеть, что он выдал подготовленную инструкцию, а не простую строку с SQL-запросом, что помогает предотвратить атаку SQL-инъекцией.
Хорошо, на данный момент вы уже вполне освоились с GitHub Copilot. Но держитесь крепче, потому что впереди еще много работы!
Практикуйтесь в Парном Программировании с Виртуальным Собеседником
Еще до посещения официального веб-сайта GitHub Copilot вы быстро заметите в результатах веб-поиска, что он рекламируется как Программист AI pair. В двух словах, парное программирование - это популярная гибкая методика, при которой два инженера совместно работают над одним и тем же функциональным компонентом. На первый взгляд, производство подобного программного обеспечения обходится дороже, но в долгосрочной перспективе оно обещает меньшее количество дорогостоящих исправлений ошибок.
Преимущества парного программирования включают в себя:
- Более высокое качество создаваемого кода
- Улучшение общего понимания кодовой базы всей командой
- Знания и обмен передовым опытом
Трудно переоценить преимущества общения с реальным человеком, который может дать честный отзыв о вашем коде, выявить основные проблемы и направить вас в правильном направлении. Многие преимущества парного программирования видны только тогда, когда оно выполняется совместными усилиями команды. С другой стороны, искусственный интеллект потенциально может давать вам некачественные рекомендации, что приведет к снижению качества кода. В конечном счете, вам решать, прислушиваться к ним или нет!
Тем не менее, GitHub Copilot действительно хорошо работает над повышением вашей производительности, в чем вы скоро убедитесь.
Сгенерируйте образцы данных для тестирования
В процессе ежедневной разработки вам часто приходится думать о примерах данных для ваших тестов, документации или настройках по умолчанию. Если вы не знаете, что делать, на помощь приходит GitHub Copilot. Например, вспомните класс Person, который вы определили ранее:
from dataclasses import dataclass
from datetime import date
@dataclass
class Person:
first_name: str
last_name: str
birth_date: date
def age(self):
return (date.today() - self.birth_date).days // 365
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
Теперь предположим, что вам нужно создать несколько экземпляров этого класса для представления сотрудников компании. Пока вы все еще редактируете тот же файл или импортируете класс Person из другого модуля, вы можете использовать GitHub Copilot для заполнения списка сотрудников. Объявите пустой список Python, используя выразительное имя переменной, и нажмите Введите сразу после открывающей квадратной скобки ([), чтобы вызвать предложения:
employees = [
Если вы будете нажимать Вкладку после каждой предложенной строки, у вас может получиться следующий список сотрудников:
employees = [
Person("John", "Smith", date(1970, 1, 1)),
Person("Jane", "Doe", date(1980, 1, 1)),
Person("Joe", "Doe", date(1990, 1, 1)),
Person("Jack", "Doe", date(2000, 1, 1)),
Person("Jill", "Doe", date(2010, 1, 1)),
Person("Jana", "Doe", date(2020, 1, 1)),
]
Второй пилот GitHub успешно решил использовать ваш класс Person для элементов списка сотрудников. Позже вы сможете использовать этот список в качестве общего тестового приспособления для группы тестовых случаев, которые этого требуют. Например, вы можете обернуть список в функцию, которую вызовет ваш тестовый фреймворк. GitHub Copilot может стать отличным помощником в тестировании самого процесса, предлагая как тесты, так и тестируемый код.
Хотите, чтобы тестовый пример появился волшебным образом
Рекомендуется присваивать своим тестовым функциям длинные и описательные названия, поскольку они будут отображаться в отчете о выполнении теста. При сбое одной из них, правильно названная тестовая функция сразу же привлечет ваше внимание к тому, что не работает. Сторонники разработки на основе поведения рекомендуют использовать целые предложения, начинающиеся со слова следует, чтобы сосредоточиться на тестируемом поведении, которое делает тест похожим на бизнес-требование спецификация.
Дополнительным преимуществом таких иногда смехотворно длинных имен функций является то, что GitHub Copilot может использовать их, чтобы помочь вам в создании реализации тестового примера. Например, определите следующую сигнатуру функции в тестовом модуле вашего класса Person:
def test_should_not_be_able_to_set_full_name():
Большинство тестовых платформ автоматически обнаружат тестовые примеры, если они соответствуют стандартным соглашениям об именовании, например, если вы добавляете к именам тестовых функций префикс test_. С помощью GitHub Copilot предложение, инициируемое для приведенной выше функции, может выглядеть следующим образом:
def test_should_not_be_able_to_set_full_name():
person = Person("John", "Doe", date(1980, 1, 1))
with pytest.raises(AttributeError):
person.full_name = "Jane Doe"
Любопытно, что GitHub Copilot предпочитает внешнюю библиотеку pytest, которую вы должны установить и импортировать вручную, встроенному модулю unittest, доступному в стандартной библиотеке.
Примечание: Этот выбор может рассказать вам кое-что о популярности обоих инструментов, и действительно, pytest, возможно, является одной из самых распространенных и универсальных тестовых платформ в экосистеме Python.
Хотя автоматизация реализации тестового примера для существующего кода иногда может быть полезна, вероятно, еще более желательно изменить этапы и разрабатывать программное обеспечение по принципу "сверху вниз", используя разработку, управляемую тестированием. При таком подходе вы сначала пишете свой тестовый пример в виде высокоуровневой спецификации кода, которая еще не существует. Как только у вас есть автоматизированный тестовый пример, вы пишете некоторый код, чтобы он прошел.
Разработка на основе физических тестов (TDD)
Если вы раньше не практиковали TDD, то ознакомьтесь с Руководством по созданию хэш-таблицы на Python с помощью TDD для практического использования.продолжаем пошаговый ускоренный курс по разработке на основе тестирования.
Вкратце, вы можете разделить процесс на три этапа:
- Напишите неудачный тестовый пример, который вы собираетесь выполнить
- Реализуйте наименьший объем кода, чтобы ваш тестовый пример прошел успешно
- При необходимости выполните рефакторинг кода, пока все ваши тестовые примеры еще проходят проверку
Затем промойте и повторите процедуру! Пока вы достаточно дисциплинированы, чтобы оставаться в этом бесконечном цикле, вы будете писать тестируемый код, который имеет высокий охват тестированием и документирует сам себя. В то же время вы избежите написания кода, который вам никогда не понадобится, что снизит общие затраты на обслуживание. Тем не менее, разработка на основе тестирования - это не единственный выход, поэтому она может оказаться непрактичной, например, в проектах исследований и разработок.
Хорошо, как насчет того, чтобы повторить реализацию HashTable из упомянутого выше руководства, используя GitHub Copilot в качестве программиста виртуальной пары? Создайте два пустых файла Python рядом друг с другом в одной папке:
src/
├── hashtable.py
└── test_hashtable.py
Первый из них, показанный слева на видео ниже, будет содержать тестируемый код. Другой, показанный справа, будет содержать ваши тестовые примеры, определяющие реализацию. Затем напишите свой первый тестовый пример, чтобы проверить создание экземпляра нового класса HashTable:
Обратите внимание, что для выполнения разработки, основанной на тестировании, вы должны запускать каждый тестовый пример до и после реализации соответствующего фрагмента кода, чтобы быть уверенным, что вы тестируете правильную вещь. Кроме того, вам следует реализовать только минимум, удовлетворяющий требованиям ваших тестов. Но GitHub Copilot пошел на шаг впереди, попытавшись предсказать код, который может понадобиться вам в будущем. Это не совсем подходящая методология разработки, основанная на тестировании.
Итак, вот два тестовых примера, которые вы только что написали, чтобы проверить, можете ли вы создать хэш-таблицу с начальной емкостью или без нее:
# test_hashtable.py
from hashtable import HashTable
def test_should_create_hashtable():
assert HashTable() is not None
def test_should_create_hashtable_with_capacity():
assert HashTable(capacity=10) is not None
Основываясь на них, GitHub Copilot на данный момент сгенерировал следующую реализацию хэш-таблицы:
# hashtable.py
class HashTable:
def __init__(self, capacity=10):
self.capacity = capacity
self.buckets = [None] * capacity
self.size = 0
Метод initializer устанавливает значение емкости по умолчанию равным десяти на случай, если кто-то создаст хэш-таблицу без предоставления каких-либо аргументов, решение о котором принимается на основе вашего первого тестового примера. Затем емкость сохраняется в атрибуте экземпляра. Обратите внимание, что второй пилот GitHub правильно распознал разницу между размером хэш-таблицы и ее емкостью. Он также использовал классическую реализацию хэш-таблицы, основанную на разделении цепочки путем создания пустых блоков.
Хотя GitHub Copilot, возможно, и не так хорошо, как программист-человек, прикрывает вашу спину, он выполняет поистине фантастическую работу в качестве виртуального помощника, предоставляя ответы на ваши вопросы. Это похоже на то, как если бы кто-то искал в Google или Stack Overflow решение вашей уникальной проблемы, встроенное в редактор кода именно там, где вам нужно!
Избавьтесь от переполнения стека для мгновенных контекстно-зависимых решений
Интернет полон шуток о чрезмерном использовании таких сайтов, как Stack Overflow или Google, для поиска ответов на вопросы программиста. Например, были пародии на обложки популярных книг О'Рейли, таких как знаменитая , Скопированная и вставленная из Переполнение стека:
Копирование и вставка из Stack Overflow (Изображение: @ThePracticalDev)
Это неудивительно, учитывая, что большинство разработчиков регулярно используют эти инструменты при выполнении своих повседневных задач, и в наши дни без них было бы трудно обойтись.
GitHub Copilot может уменьшить вашу зависимость от этих инструментов. Он может мгновенно предоставить индивидуальные фрагменты кода, которые идеально вписываются в контекст вашего проекта, в отличие даже от лучших ответов, которые вы могли бы найти в Интернете. Более того, это не заставляет вас покидать редактор кода, так что вы можете оставаться в курсе событий и ускорять свой прогресс. Читайте дальше, чтобы почувствовать, что коллективные знания сообщества Python у вас под рукой.
Никогда Больше Не Думайте О Шаблонном Коде
Python обладает относительно выразительным синтаксисом, который позволяет писать лаконичный и читаемый код. Тем не менее, иногда шаблонный код неизбежен даже в вашем любимом языке программирования. Иногда просто невозможно обойтись без написания фрагмента кода, который выглядит длинным и многословным, но, по-видимому, не выполняет большой полезной работы.
Например, извлекаем данные из URL-адреса, преобразуем их в JSON и сохраняем результат в файл содержит множество скучных деталей, которые не представляют особой ценности. Разве не было бы здорово, если бы вы могли сосредоточиться на том, что важно для вас больше всего, то есть на поиске решения проблемы более высокого уровня, позволяя второму пилоту GitHub сопоставлять отдельные шаги с фрагментами кода?
Что ж, оказывается, вы можете! Как и прежде, начните с написания описательной подписи функции, а остальное предоставьте второму пилоту GitHub:
def save_json(url, filename):
Предлагаемый текст функции в ответ на приведенную выше сигнатуру может быть следующим:
def save_json(url, filename):
import json
import requests
import os
if not os.path.exists(filename):
with open(filename, "w") as f:
f.write(json.dumps(requests.get(url).json()))
else:
print("File already exists")
Он основан на внешней библиотеке запросов, которую вам, возможно, потребуется установить, поскольку это стандарт де-факто для создания HTTP запросы на Python. Функция использует преимущества контекстного менеджера, чтобы закрыть файл после ввода в него JSON. Это уже достаточно хорошо, но вы можете захотеть добавить несколько косметических изменений:
import json
import os
import requests
def save_json(url, filename):
if not os.path.exists(filename):
with open(filename, mode="w", encoding="utf-8") as file:
file.write(json.dumps(requests.get(url).json()))
else:
print("File already exists")
Согласно руководству по стилю PEP 8, вы, как правило, должны определять свои инструкции import вне функций, а внешние библиотечные модули должны располагаться после стандартных библиотечных модулей. Кроме того, рекомендуется явно указывать кодировку символов , например, UTF-8, при работе с файлами в Python, чтобы избежать расхождений между различными операционными системами это может предполагать несовместимые значения по умолчанию.
Примечание: Вы можете использовать black или аналогичный инструмент, чтобы сохранить соответствие форматирования сгенерированного кода остальной части вашего проекта.
Использование GitHub Copilot может быть немного безопаснее, чем Stack Overflow. При использовании Stack Overflow вы можете обнаружить, что бездумно копируете и вставляете чужой код дословно, не понимая его до конца и не задумываясь о том, имеет ли это смысл в вашей ситуации. Принятие предложения второго пилота на GitHub может быть таким же безрассудным, если не более, но, по крайней мере, это дает вам точно настроенный, зависящий от контекста фрагмент головоломки, который с большей вероятностью сработает, чем нет.
Еще одна область, в которой выделяется GitHub Copilot, заключается в том, что она избавляет вас от необходимости копаться в документации библиотеки или API, которые вы хотите использовать.
Документация по API всегда должна быть у Вас под рукой
Допустим, вы хотели написать небольшую функцию на Python, чтобы получить список общедоступных репозиториев пользователя GitHub. При традиционном подходе вы бы начали с поиска в Интернете github api и попали бы на страницу документации GitHub REST API. Тогда вы, вероятно, были бы ошеломлены количеством альтернативных REST API на выбор, а также всеми их руководствами, краткими инструкциями по запуску и справочной документацией.
К счастью, у вас есть второй пилот GitHub, который был обучен использовать хорошо известные API, так что вы можете дать ему минимальную подсказку о том, какой API вызывать. Создайте новый модуль Python с именем github_api_client и введите в него следующий код:
# github_api_client.py
import os
GITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN")
def get_repository_names(username):
Позже вы запустите этот скрипт в терминальном сеансе с вашим токеном, сохраненным в переменной окружения . Обычно данные секретных ключей и конфигурации считываются с помощью переменных окружения, поэтому вы можете воспользоваться модулем os Python для считывания ваших данных. личный токен API GitHub, который может вам понадобиться для доступа к API.
Примечание: Хотя вам не нужен токен для доступа к чьим-либо общедоступным репозиториям, вы будете ограничены шестьюдесятью запросами к API в час как анонимный клиент. Чтобы преодолеть это ограничение, вам нужно пройти аутентификацию, используя свой личный токен доступа . Имеет смысл сделать это сейчас, поскольку большинство конечных точек API в любом случае требуют аутентификации.
Один из предложенных результатов в конечном итоге работает прямо из коробки:
# github_api_client.py
import os
GITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN")
def get_repository_names(username):
import requests
url = f"https://api.github.com/users/{username}/repos"
headers = {"Authorization": f"token {GITHUB_API_TOKEN}"}
response = requests.get(url, headers=headers)
response.raise_for_status()
return [repo["name"] for repo in response.json()]
Перед тестированием этой функции не забудьте сгенерировать новый личный токен доступа в своем профиле на GitHub и установить соответствующую переменную среды в вашем терминале:
PS> $env:GITHUB_API_TOKEN=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
$ export GITHUB_API_TOKEN=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
Затем, пока вы все еще находитесь в том же терминальном сеансе, в котором вы определили переменную окружения, запустите исходный файл с вашим кодом в интерактивном режиме, чтобы Python прочитал сгенерированную функцию, которую вы можете вызов:
$ python -i github_api_client.py
>>> for name in get_repository_names("gvanrossum"):
... print(name)
...
500lines
asyncio
ballot-box
cpython
ctok
exceptiongroup
guidos_time_machine
gvanrossum.github.io
http-get-perf
minithesis
mirror-cwi-stdwin
mypy
mypy-dummy
path-pep
patma
pep550
peps
Pyjion
pythonlabs
pythonlabs-com-azure
pytype
pyxl3
В данном случае вы получаете довольно короткий список общедоступных репозиториев, созданных Гвидо ван Россумом, создателем Python.
Хорошо, использовать хорошо известный API было не особенно сложно, но как насчет использования пользовательского API, которого Copilot на GitHub раньше не видел? Что ж, об этом вы узнаете позже.
Научите второго пилота GitHub говорить на вашем родном диалекте
Предположим, у вас есть следующий модуль Python, который определяет пользовательский API для синтеза речи путем преобразования текста в речь (TTS) команда на одной из трех основных платформ:
# custom_api.py
import platform
import subprocess
class TextToSpeechAPIClient:
def __init__(self, command=None):
self.command = command or get_default_command()
def say(self, text):
subprocess.call(self.command(text))
def get_default_command():
match platform.system():
case "Darwin":
return lambda text: ["say", text]
case "Linux":
return lambda text: ["spd-say", text]
case "Windows":
return lambda text: \
"PowerShell -Command \"Add-Type –AssemblyName System.Speech; " \
"(New-Object System.Speech.Synthesis.SpeechSynthesizer)." \
f"Speak('{text}');\""
Класс TextToSpeechAPIClient принимает необязательный аргумент с командой синтеза речи, относящейся к вашей операционной системе. Вспомогательная функция, определенная ниже, использует оператор match, представленный в Python 3.10, для определения правильной команды.
Теперь создайте еще один модуль на Python и попросите GitHub Copilot научиться использовать ваш новый API, высказав пожелание в комментарии:
# main.py
# Say "Hello, World!" using the custom text-to-speech API client.
if __name__ == "__main__":
Условие выполнения в конце вашего файла предоставляет GitHub Copilot необходимый контекст, сообщая, что вы хотите написать скрипт на Python. В противном случае вы могли бы получать менее полезные предложения. Однако, с учетом этой важной проверки, одно из предложений будет выглядеть следующим образом:
# main.py
# Say "Hello, World!" using the custom text-to-speech API client.
if __name__ == "__main__":
import custom_api
client = custom_api.TextToSpeechAPIClient()
client.say("Hello, World!")
Отлично! GitHub Copilot нашел ваш пользовательский API в другом модуле Python, импортировал его туда, где это было необходимо, и использовал класс TextToSpeechAPIClient именно так, как нужно. Несмотря на то, что он прекрасно справлялся с локальным модулем, с таким же успехом можно было бы предложить фрагменты кода для сторонних модулей.
Навигация по незнакомой платформе или библиотеке
Изучение новых библиотек на Python с помощью GitHub Copilot - это приятное занятие. Возможно, вы пересматриваете фреймворк, о котором вы немного подзабыли, и пытаетесь вспомнить, с чего начать. Но даже если вы хорошо знакомы с данным инструментом, GitHub Copilot иногда может удивить вас, предложив более эффективные решения или части своего API, о которых вы понятия не имели.
Допустим, вы хотите предоставить доступ к конечной точке REST API, используя фреймворк Flask для предоставления списка книг, запрошенного в формате JSON из файловая база данных SQLite. Теперь создайте новый исходный файл на Python, импортируйте необходимые модули и адаптируйте предыдущее предложение из этого абзаца в комментарий на Python:
import sqlite3
import flask
# Expose a REST API endpoint using the Flask framework \
# to serve a JSON-serialized list of books queried from \
# a file-based SQLite database.
Дождитесь поступления предложений, а затем выберите то, которое выглядит лучше всего. Иногда вы получите лучшие результаты, если начнете вводить ожидаемый код и постепенно запрашивать предложения построчно, нажимая Tab в каждой строке. В конце концов, у вас может получиться что-то вроде этого:
import sqlite3
import flask
# Expose a REST API endpoint using the Flask framework \
# to serve a JSON-serialized list of books queried from \
# a file-based SQLite database.
app = flask.Flask(__name__)
@app.route("/books")
def get_books():
conn = sqlite3.connect("books.db")
c = conn.cursor()
c.execute("SELECT * FROM books")
books = c.fetchall()
conn.close()
return flask.jsonify(books)
if __name__ == "__main__":
app.run(debug=True)
В этом случае GitHub Copilot создал типичную структуру приложения Flask, о которой вы, возможно, забыли, и определил конечную точку, которую вы запрашивали. Чтобы проверить, работает ли это, откройте свой терминал в той же папке, что и ваше приложение Flask, и создайте новую файловую базу данных под названием books.db с несколькими примерами книг.
Для ввода SQL-запросов вы можете запустить команду sqlite3 в пакетном режиме и завершить ее символом конца файла (EOF):
$ sqlite3 books.db -batch
CREATE TABLE books(
id INTEGER PRIMARY KEY AUTOINCREMENT,
isbn TEXT,
author TEXT,
title TEXT
);
INSERT INTO books(isbn, author, title) VALUES
('978-0132350884', 'Robert C. Martin', 'Clean Code'),
('978-1449340377', 'David Beazley', 'Python Cookbook'),
('978-0131872486', 'Bruce Eckel', 'Thinking in Java'),
('978-1775093329', 'David Amos', 'Python Basics');
В Windows вы обычно можете отправить символ EOF в стандартный поток ввода, используя Ctrl+Z, в то время как в Linux и macOS вы будете использовать комбинацию клавиш Ctrl+D.
Затем запустите приложение Flask с сетевым интерфейсом и номером порта по умолчанию, запустив свой скрипт, а затем перейдите в веб-браузере к конечной точке /books. В качестве альтернативы, вы можете использовать команду типа cURL непосредственно в вашем терминале, чтобы получить книги, если вы используете macOS или Linux:
$ curl http://127.0.0.1:5000/books
[
[
1,
"978-0132350884",
"Robert C. Martin",
"Clean Code"
],
[
2,
"978-1449340377",
"David Beazley",
"Python Cookbook"
],
[
3,
"978-0131872486",
"Bruce Eckel",
"Thinking in Java"
],
[
4,
"978-1775093329",
"David Amos",
"Python Basics"
]
]
Весьма примечательно, что код, сгенерированный Copilot на GitHub, жив! Только подумайте об этом. Вы просто предоставили описание желаемой программы на естественном языке и импортировали два модуля, чтобы указать, какие библиотеки использовать. Тем временем искусственный интеллект превратил ваше описание в рабочее веб-приложение.
Как бы то ни было, у GitHub Copilot есть свои темные стороны, о которых вы узнаете в следующем разделе.
Рассмотрим аргументы против использования второго пилота GitHub
Когда вы будете искать информацию о GitHub Copilot в Интернете, вы найдете слова похвалы и восхищения, а также справедливую критику. Часть из них справедлива, в то время как часть проистекает из непонимания назначения технологии. В конечном счете, GitHub Copilot означает разные вещи для разных людей. Прочитав этот раздел, вы узнаете о наиболее существенных недостатках вашего виртуального помощника на базе искусственного интеллекта.
Это определенно не автопилот!
Название copilot было удачно выбрано GitHub для описания этого продукта. Это позволяет избежать введения людей в заблуждение, заставляя их думать, что он может взять управление на себя и заменить вас как программиста. Точно так же, как первый офицер в авиации, которого обычно называют вторым пилотом, второй пилот GitHub помогает вам, но не выполняет работу за вас. Эта формулировка контрастирует с усовершенствованными системами помощи водителю, которые некоторые производители автомобилей сегодня без обиняков называют автопилотами.
Вы должны помнить, что код, созданный с помощью GitHub Copilot, не всегда идеален. На самом деле, иногда он может быть неоптимальным или небезопасным, а также может следовать неправильным методам программирования.
Это не такая большая проблема, когда код содержит синтаксические ошибки или если он совершенно бессмысленный, потому что это легко обнаружить. Однако код, который на первый взгляд выглядит правдоподобным, все равно может быть некорректным и содержать логические ошибки. Поэтому вам не следует никогда доверять GitHub Copilot без тщательного изучения и тестирования генерируемого им кода!
Другими словами, GitHub Copilot - это ценный инструмент, который стоит иметь под рукой, но вам определенно не следует полагаться только на его предложения, например, при создании критически важного программного обеспечения для атомной электростанции.
Представляет потенциальную угрозу безопасности
Поскольку модель машинного обучения, лежащая в основе GitHub Copilot, была разработана в общедоступных репозиториях, она уязвима к заражению данных. Злоумышленник мог намеренно загрязнить обучающий набор данных вредоносным кодом, который может заставить модель использовать аналогичные шаблоны в вашем редакторе кода. Это также могло произойти случайно из-за большого количества кода в обучающих данных.
Опять же, используйте GitHub Copilot на свой страх и риск!
Вызывает озабоченность по поводу прав интеллектуальной собственности
Второй пилот GitHub может нарушать права интеллектуальной собственности, что на данный момент является наиболее серьезной проблемой. Поскольку он синтезирует код на основе того, что видел ранее, это может привести к утечке проприетарных алгоритмов из частных репозиториев, защищенных авторским правом общедоступных репозиториев или даже репозиториев с открытым исходным кодом с неразрешающей лицензией.
Примечание: Чтобы использовать GitHub Copilot, вы должны принять его положения и условия, в которых явно указано, что вы даете согласие на совместное использование код и данные, размещенные в ваших хранилищах, включая ваши личные, для улучшения сервиса.
Создатель Flask, Армин Роначер, недавно продемонстрировал в твите, как GitHub Copilot цитирует Разработанная компанией Quake точная реализация алгоритма быстрого извлечения обратного квадратного корня. Хотя сгенерированный код приписывается Джону Кармаку, второй пилот GitHub предложил совершенно случайную лицензию поверх него:
Полученный код в приведенном выше примере даже содержит оригинальный комментарий с ругательством. GitHub утверждает, что на нем есть фильтры, которые теоретически должны блокировать такие слова. Они также должны удалить конфиденциальную информацию, такую как ключи API или адреса электронной почты, которые могли случайно попасть на GitHub. Тем не менее, вы никогда не можете знать наверняка.
Поощряет мошенничество
GitHub Copilot может стать отличным инструментом обучения, если вы хотите освоить новый язык программирования, фреймворк, библиотеку или API. В то же время нетрудно представить, что некоторые студенты злоупотребляют GitHub Copilot, чтобы обмануть, скопировав и вставив описание задачи на простом английском языке и получив решение за считанные секунды. Вспомните о появлении Code puzzle, которое вы описывали в начале этого урока.
Кроме того, студенты, не имеющие намерения списывать, могут предпочесть держаться подальше от GitHub Copilot, поскольку это может сделать их ленивыми и отбить у них охоту мыслить самостоятельно. Как и в случае с любым мощным инструментом, вы можете использовать GitHub Copilot для правильных или неправильных целей.
Требуется тарифный план подписки
Одной из наиболее распространенных жалоб на GitHub Copilot является тот факт, что для него требуется платная подписка, что ограничивает количество потенциальных пользователей. Многие люди, похоже, расстроены тем, что с них берут деньги за инструмент, который, предположительно, был разработан в основном на основе открытого исходного кода.
Что еще хуже, фиксированная плата устанавливается независимо от того, в какой точке мира вы находитесь. При этом не учитывается паритет покупательной способности, что делает подписку более обременительной для клиентов в одних странах, чем в других. Цена, вероятно, покажется разумной, если вы работаете инженером в стране с высокой покупательной способностью или если ваша компания покупает подписку оптом. В противном случае цена может быть очень высокой.
С другой стороны, справедливо, что GitHub, по крайней мере, предлагает пробный период и делает сервис доступным бесплатно для проверенных студентов и разработчиков с открытым исходным кодом. В конечном счете, хотя для некоторых цены могут оказаться непомерно высокими, в целом это хорошее соотношение цены и качества, особенно учитывая затраты на обслуживание инфраструктуры для такой огромной нейронной сети. В конце концов, для работы требуется распределенный кластер и низкая задержка.
Примечание: Если вы хотите бесплатно получить доступ к помощи в программировании на базе искусственного интеллекта, то, возможно, ChatGPT является вашим наставником по программированию.
Если вы хотите погрузиться глубже и узнать больше о базовой модели машинного обучения, то прочтите оригинальную статью , посвященную Кодексу OpenAI.
Заключение
GitHub Copilot - это революционное средство программирования, которое может повысить вашу скорость и производительность как инженера-программиста. Это экономит ваше время, генерируя стандартный код и избавляя вас от необходимости копаться в документации. Поскольку он понимает контекст вашего проекта, мгновенные предложения, которые вы получаете, составлены специально для вас и обычно работают так, как вы задумали.
В этом руководстве вы узнали, как:
- Установите расширение GitHub Copilot в свой редактор кода
- Преобразовать описание задачи на естественном языке в рабочий код
- Выберите один из нескольких вариантов интеллектуальное завершение кода предложения
- Исследуйте незнакомые фреймворки и языки программирования
- Научите второго пилота GitHub пользоваться вашим пользовательским API
- Выполняйте разработку на основе тестирования с помощью виртуального парного программиста в режиме реального времени
Что вы думаете о GitHub Copilot? Стоит ли оно того? Достаточно ли оно вам нравится, чтобы использовать его в своих будущих проектах? Оставьте нам комментарий ниже!
Скачать бесплатно: Нажмите здесь, чтобы скачать бесплатную шпаргалку с сочетаниями клавиш, которая позволяет еще быстрее программировать с помощью GitHub Copilot.
<статус завершения article-slug="github-copilot-python" class="btn-group mb-0" data-api-article-bookmark-url="/api/v1/articles/github-copilot-python/bookmark/" данные-api-статья-статус завершения-url="/api/v1/articles/github-copilot-python/completion_status/"> статус завершения> <поделиться-кнопка bluesky-text="Интересная статья #Python от @realpython.com :" email-body="Ознакомьтесь с этой статьей о Python:%0A%0AGitHub Copilot: Летайте с Python со скоростью мысли" email-subject="Статья о Python для вас" twitter-text="Интересная статья о Python от @realpython:" url="https://realpython.com/github-copilot-python /" url-title="Второй пилот на GitHub: Летай на Python со скоростью мысли"> поделиться-кнопка>
Back to Top