Декодировать любой код Python с помощью этого 5-ступенчатого метода

Возможность читать код других имеет важное значение для поддержания, улучшения и сотрудничества в любом значимого программного проекта. Редко можно написать весь исходный код в приложении самостоятельно, и даже реже, что приложение будет полностью переписано с нуля. Скорее всего, ваш рабочий процесс будет включать в себя работу с кодом, который был написан кем -то другим (который больше не может быть доступен, чтобы объяснить это), и итерация другими (которые также могут быть недоступны) задолго до того, как он когда -либо появится на вашем экране.

Это делает чтение и понимание существующего кода так же важным, как и написание самостоятельно. Не зная, что происходит, линейна по линии, персонаж по персонажу, вы не сможете отладить, улучшать функции, развивать продукт или эффективно сотрудничать с кем -либо. Иногда код аккуратный, организованный и хорошо документированный. Иногда меньше. Ваша способность понимать это не должна зависеть от того, насколько она отполирована.

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

Файл ниже называется script.py:

Этот файл — data.json:

Мы используем 5-шаговый контрольный список, чтобы определить, что этот код делает элемент 1: Что делает программа в целом?

Выявление целей программы по общему картину обеспечивает план понимания ее деталей.

Хорошее место для начала — это поиск ее основной функции и видя, как другие функции взаимодействуют с ней. В нашем примере Runner () является основной функцией. Мы можем сказать, что это основная функция, потому что она вызывает F1, F2 и F3 соответственно.

В Runner () мы можем интерпретировать следующий рабочий процесс:

  • F1 (‘Data.json’) — это самое первое, что происходит.
  • F2 (данные) обрабатывает данные, возвращаемые F1.
  • F3 (сгруппированный) обрабатывает результат F2.
  • Наконец, он зацикливается на stats.items () и печатает что -то отформатированное как число ({v: .2f}).

Мы также можем сделать разумный вывод, что:

F1 загружает данные (мы можем сказать это json.load ()).

Группы F2 или реорганизуют его с помощью DefaultDict (List) и добавления (i) на категорию.

F3 вычисляет цифровые резюме или агрегаты, используя сумму (…) и делящий от Len (V).

Результаты печати петли:

Мы готовы ответить на следующий вопрос …

Пункт 2: Как организован код?

Понимание структуры говорит вам, где искать каждый кусок логики.

Отличная отправная точка для понимания того, как организован код, состоит в том, чтобы найти импорт, функции и точки входа.

Верхняя часть файла идентифицирует импорт:

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

Вы можете идентифицировать функции, ища линии, которые начинаются с DEF. Разрыв кода на функции помогает вам читать и понимать одну часть за раз.

Вы можете определить точку входа в этом специальном блоке в нижней части сценария:

Понимание того, с чего начинается программа, поможет вам проследить поток от начала до конца. Это означает, что когда вы напрямую запускаете скрипт (python script.py), Python запускает код внутри этого блока. Функция или код, вызванный здесь (Runner () в данном случае) является отправной точкой выполнения.

В нашем примере сценарий импортирует JSON и DefaultDict, так что вы можете ожидать, что он будет обрабатывать данные JSON и выполнить операции группировки. Он определяет функции F1, F2, F3 и Runner (). Создавая то, что мы узнали в последнем разделе, это говорит о том, что код организован в модульные задачи, такие как чтение файлов, обработка данных и запуск основной логики.

Входная точка вызывает Runner (), указывающий, что эта функция является основной рутинной координацией выполнения программы.

Элемент 3: Каковы основные входы и выходы?

Понимание того, что входит в программу (вход), и что выходит (вывод), помогает мысленно создавать то, что делает сценарий на высоком уровне.

Вот как найти входные данные.

Посмотрите на первую функцию, вызванную в Runner (): data = f1 (‘data.json’). Это говорит нам следующее:

  • Скрипт считывается из файла с именем data.json.
  • Если мы заглядываем внутрь f1 (), мы видим, что он использует json.load (f), что подтверждает, что вход является файлом, форматированным JSON.
  • Фактическое содержание (в data.json) представляет собой список словарей, каждый из которых имеет категорию и поле значения.
  • Этот структурированный ввод проанализируется в список словарей Python, каждый словарь представляет одну точку данных.

Вот как найти результаты.

Эта петля находится в конце Runner ():

Цикл печатает каждый ключ (вероятно, имя категории) и номер с плавающей точкой с двумя десятичными местами. Основываясь на более ранних функциях, мы можем сделать вывод, что это среднее значение для каждой категории.

Пример вывода из этого цикла:

Это подтверждает, что сценарий суммирует значения по категории и печатает результаты.

Из всех этих деталей мы можем понять входы и выходы. Основным входом является файл JSON, содержащий список элементов, каждый из которых имеет категорию и значение. Выход — это простой текст, напечатанный на консоли (в частности, резюме, показывающее среднее значение для каждой категории).

Элемент 4: Как данные проходят через функции?

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

Давайте следуем по данным через каждую функцию в порядке, которую он называется.

f1 (‘data.json’)

Вход — это data.json

Функция открывает файл с именем data.json в режиме чтения. Он использует json.load () для анализа содержимого. Результат возвращается в виде списка словарей, подобных этой (json.load (), всегда выводит словаря и списки).

Выход:

Это становится входным вводом для F2.

F2 (пункты)

Эта функция создает пустой дефолт с списками в качестве значения по умолчанию. Он переходит к каждому словару в списке, возвращенном F1. Он просматривает ключ «категории» для каждого элемента. Если категория не существует, она возвращает «неизвестно». Затем он добавляет весь словарь к списку соответствующей категории.

Выход:

Эти данные становятся входными веществами для F3.

F3 (D)

Эта функция берет сгруппированный словарь от F2. Это создает пустой словарь, вызванный. В каждой паре ключевых значений K-это категория, а V-список элементов в этой категории.

Он вычисляет следующее:

  • S = сумма (x[‘value’] для x in v): общая сумма всех полей стоимости
  • m = s / len (v): среднее значение

Он хранит средний[k]Полем

Выход:

Это становится переменной статистикой в ​​Runner (), которая затем напечатана.

Runner ()

Runner () вызывает F1, F2 и F3 в их надлежащей последовательности. Он получает последний словарь средних значений. Затем он переходит по stats.items () и печатает каждую категорию и его среднюю, отформатированную до 2 десятичных знаков.

Выход:

Что это значит?

Следуя данным через каждую функцию, показывает прогрессивное преобразование:

Список RAW JSON становится сгруппирован по категории, которая становится в среднем по категории и, наконец, напечатано как резюме.

Чтобы пройти через это самостоятельно и посмотреть, что возвращает любая функция, добавьте операторы print () после каждого вызова:

Пункт 5: Запустите код и посмотрите, что произойдет

Запуск сценария — это самый быстрый способ подтвердить вашу ментальную модель того, что делает код. Вы можете сделать этот шаг в любое время в этом процессе. Запуск кода также помогает вам поймать недостающие файлы, проблемы с форматом даты и все другие неожиданные ошибки.

Как запустить этот файл:

  • Убедитесь, что вы сохранили свой скрипт как script.py.
  • Убедитесь, что ваш файл data.json находится в той же папке, что и script.py.
  • Откройте свой терминал или командную строку.
  • Перейдите к папке, содержащей оба файла.
  • Запустить: python script.py.
  • Фактический вывод:

    Когда ожидаемый выход соответствует фактическому выводу, он подтверждает, что у вас нет ошибок, и ваша среда настроена правильно. Это также подтверждает, что у вас есть правильное понимание того, что делает код.

    Полезные советы

    Вот некоторые вещи, которые вы можете сделать в дополнение к контрольному списку, чтобы помочь вам в понимании кода:

    • Используйте инструменты для проверки переменных. Осматривание переменных позволяет вам точно увидеть, что находится в памяти.
    • Сделайте заметки и диаграммы на основе кода. Примечания и диаграммы помогают вам отслеживать отношения между структурами данных.
    • Узнайте, какие библиотеки используются. Понимание библиотек помогает вам знать, какие помощники доступны.

    И наконец: будьте терпеливы! Даже опытные разработчики тратят время на декодирование неясных имен.

    Заключение

    Чтение чужого кода Python, особенно когда имена неясны, может быть сложным, особенно поначалу. Но, разбивая его шаг за шагом, вы можете превратить запутанные сценарии в то, что вы полностью понимаете.

    Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Джессика Вахтел — писатель по маркетингу разработчиков в InfluxData, где она создает контент, который помогает сделать данные о мире временных рядов более понятными и доступными. Джессика имеет опыт работы в разработке программного обеспечения и технической журналистике. Подробнее от Джессики Вахтел

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *