pycharm привести код к pep8 горячие клавиши
Reformat and rearrange code
You can reformat a part of code, the whole file, group of files, a directory, and a module. You can also exclude part of code or some files from the reformatting. PyCharm adheres to PEP8 rules and requirements for arranging and formatting Python code.
Reformat a code fragment in a file
In the editor, select a code fragment you want to reformat.
If you don’t select a code fragment, PyCharm will reformat the whole file.
Reformat a file
Keep pressing Shift and select additional files for a group reformatting.
In the dialog that opens, if you need, select the following reformatting options:
Optimize imports : select this option if you want to remove unused imports, add missing ones, or organize import statements.
Rearrange entries : select this option if you need to rearrange your code based on the arrangement rules specified in the code style settings.
Code cleanup : select this option to run the code cleanup inspections.
If you want to see the exact changes made to your code during the reformatting, use the Local History feature.
Reformat line indents
You can reformat line indents based on the specified settings.
In some cases, the option Detect and use existing file indents for editing located in the Indent Detection section in File | Settings/Preferences | Editor | Code Style can override your settings. In this case PyCharm will display a notification.
Automatically reformat code on save
You can configure the IDE to reformat code in modified files automatically when your changes are saved.
Enable the Reformat code option.
Additionally, you can click Configure scope to specify the patterns of filenames and directories that you want to exclude from reformatting.
Exclude files from reformatting
You can exclude a group of files and directories from reformatting, code arrangement, and import optimization.
Switch to the Formatter tab and in the Do not format field, enter the files and directories that you want to exclude using a glob pattern.
Apply the changes and close the dialog.
Exclude code fragments from reformatting in the editor
Switch to the Formatter tab and enable the Turn formatter on/off with markers in code comments option.
The code between the markers won’t be reformatted.
Keep existing formatting
You can select formatting rules which will be ignored when you reformat the code. For example, you can adjust the IDE to keep simple methods and functions in one line, whereas normally they are expanded into multiple lines after code reformatting.
In the Keep when reformatting section, select the formatting rules which you want to ignore and deselect those which should be applied.
PyCharm will reformat your code in accordance with the current style settings, keeping existing formatting for the rules which you’ve selected.
Rearrange code
Currently, you cannot rearrange your Python code. However, the command is available for JavaScript and XML.
You can rearrange your code according to the arrangement rules set in the Code Style page of the Settings/Preferences dialog.
You can exclude specific files and folders from arrangement. For more information, refer to Exclude files from reformatting.
Rearrange code entries
Select a language for which you want to create arrangement rules.
On the Arrangement tab, specify the appropriate options such as grouping and matching rules.
Click OK to save the changes.
Automatically rearrange code on save
You can configure the IDE to rearrange code elements in modified files automatically when your changes are saved.
Enable the Rearrange code option.
Additionally, you can click Configure arrangement rules to specify the rules for reordering code elements for the selected language.
PyCharm keyboard shortcuts
PyCharm has keyboard shortcuts for most of its commands related to editing, navigation, refactoring, debugging, and other tasks. Memorizing these hotkeys can help you stay more productive by keeping your hands on the keyboard.
If your keyboard does not have an English layout, PyCharm may not detect all of the shortcuts correctly.
The following table lists some of the most useful shortcuts to learn:
Quickly find any file, action, class, symbol, tool window, or setting in PyCharm, in your project, and in the current Git repository.
Find a command and execute it, open a tool window, or search for a setting.
Quick-fixes for highlighted errors and warnings, intention actions for improving and optimizing your code.
Jump to the next or previous highlighted error.
Select a recently opened file from the list.
Increase or decrease the scope of selection according to specific code constructs.
Comment out a line or block of code.
Show all places where a code element is used across your project.
Choose the right keymap
Enable function keys and check for possible conflicts with global OS shortcuts.
Use a predefined keymap
PyCharm automatically suggests a predefined keymap based on your environment. Make sure that it matches the OS you are using or select the one that matches shortcuts from another IDE or editor you are used to (for example, Emacs).
When consulting this page and other pages in PyCharm documentation, you can see keyboard shortcuts for the keymap that you use in the IDE — choose it using the selector at the top of a page.
You can modify a copy of any predefined keymap to assign your own shortcuts for commands that you use frequently.
Import custom keymap
If you have a customized keymap that you are used to, you can transfer it to your installation.
If your keymap stopped working after an update, it is likely that the keymap is not available by default in the new version of PyCharm. Find this keymap as a plugin and install it on the Plugins page as described in Manage plugins.
Print your keymap
If you prefer a hard copy, download the default PyCharm keymap reference and print it out as a card:
Learn shortcuts as you work
PyCharm provides several possibilities to learn shortcuts:
Find Action is the most important command that enables you to search for commands and settings across all menus and tools.
Press Ctrl+Shift+A and start typing to get a list of suggested actions. Then select the necessary action and press Enter to execute it.
Key Promoter X is a plugin that shows a popup notification with the corresponding keyboard shortcut whenever a command is executed using the mouse. It also suggests creating a shortcut for commands that are executed frequently.
To print a non-default or customized keymap, use the Keymap exporter plugin.
Use advanced features
You can further improve your productivity with the following useful features:
If there is a group of actions that you often use, create a quick list to access them using a custom shortcut. For example, you can try using the following predefined quick lists:
Refactor this Ctrl+Alt+Shift+T
VCS Operations Alt+`
When the focus is on a tool window with a tree, list, or table, start typing to see matching items.
Many actions in PyCharm provide more results when you execute them multiple times. For example, when you invoke basic code completion with Ctrl+Space on a part of a field, parameter, or variable declaration, it suggests names depending on the item type within the current scope. If you invoke it again, it will include classes available through module dependencies. When invoked for the third time in a row, the list of suggestions will include the whole project.
Resize tool windows
You can adjust the size of tool windows without a mouse:
To resize a vertical tool window, use Ctrl+Alt+Shift+Left and Ctrl+Alt+Shift+Right
To resize a horizontal tool window, use Ctrl+Alt+Shift+Up and Ctrl+Alt+Shift+Down
Шпаргалка: Горячие (hotkeys) клавиши PhpStorm и PyCharm
Горячих клавиш в IDE PhpStorm и PyCharm гораздо больше, чем в приведенном ниже списке. Здесь я привел только те, которыми пользуюсь сам (* звездочкой выделил наиболее используемые мною горячие клавиши).
Шпаргалка будет обновляться, если начну использовать новые hotkeys.
Для настройки горячих клавиш или добавление собственных сочетаний клавиш перейдите File > Settings > Keymap.
Редактирование
*Ctrl + W — выделение текущего блока. Если нажимать W несколько раз, то будут выделяться родительские блоки по иерархии.
Ctrl + Shift + W — проделывает обратное действие от предыдущего
Ctrl + Y — удаляет строку
*Ctrl + D — дублирует строку
Ctrl + Shift + U — делает выделенный текст или заглавными, или строчными буквами
Ctrl + Delete — удаляет часть от курсора до конца слова
*Ctrl + Alt + L — форматирование кода соответствии с настройками code style.
*Ctrl + / — закомментировать/раскомментировать текущую строку.
Ctrl + Shift + / — закомментировать/раскомментировать выделенные строки кода.
Ctrl + Shift + J — к текущей строке присоединяет нижнюю.
Ctrl + [ или ] — перемещает курсор в начало или конец блока с кодом, в теле фукции, в теле цикла и т.д.
Ctrl + Shift + ] или [ — выделить код код до конца или до начала блока
*Tab — сделать отступ (табуляцию)
*SHIFT + Tab — убрать отступ
*Ctrl + Alt + Стрелка вверх — перемещает текущую строку вверх.
*Ctrl + Alt + Стрелка вниз — перемещает текущую строку вниз.
Ctrl + Shift + Стрелка вниз — перемещает текущий логический блок вниз
*Ctrl + Space — выводит возможные варианты автодополнения
Ctrl + курсор мыши над кодом — краткая информация
*Ctrl + клик по названию переменной или метода, или CTRL+B когда курсор установлен на названии, приведет туда, где метод или переменная определены.
*Ctrl + G — перейти к строке по номеру
*Alt + Клик левой кнопкой мышки — мультикурсор, если нужно одновременно несколько курсоров, кликаем мышкой в нужные места, куда нужно их добавить
*Ctrl + Alt + J — обрамление выделенного текста тегом (нужно выбрать первый пункт из всплывающего окошка)
F11 — быстро установить закладку
Shift + F11 — просмотр всех закладок
Поиск / замена
Двойной Shift — поиск по проекту
*Ctrl + F — поиск в текущем файле
*Ctrl + R — поиск и замена
*Ctrl+Shift+E — вызовет всплывающее окно, в котором показаны последние куски кода в разных файлах, с которыми вы работали
Ctrl + Shift + F — поиск в группе файлов (например в проекте или папке)
Ctrl + Shift + R — поиск и замена в группе файлов
Ctrl + N — найти в каком файле находится класс
*Ctrl + Shift + N — поиск файла по названию
Разное
Ctrl + Alt + S — быстрый доступ к настройкам
*Shift + F6 — переименование файла (выделите в блоке с файлами проекта нужный файл).
Code Quality Assistance Tips and Tricks, or How to Make Your Code Look Pretty?
What this tutorial is about
Python programming is out of scope of this tutorial. To learn more about the Python language, please refer to the official website.
Before you start
You are working with PyCharm version 5.0 or later. If you still do not have PyCharm, download it from this page. To install PyCharm, follow the instructions, depending on your platform. Refer to the product documentation for details.
You have created a Python project ( File|New Project. ). Refer to the product documentation for details.
You have created two directories src and test_dir ( File|New or Alt+Insert ).
You have added Python files to the src and test_dir directories of your project( File|New or Alt+Insert ). To learn about creating files, refer to the section Populating Projects.
Highliting code style violations
(Refer to Code Completion page of the product documentation for details.)
Tuning the PEP8 inspections
Apply changes and close the dialog. Now let’s return to our source code.
Tracking PEP8 rules
Code inspections and their settings
Btw, look at the Inspections more attentively. If you have just opened this page, you see the default inspection profile with the default settings: it means that the inspections apply to all the sources of the current project.
Let’s try to customize this profile for two different scopes:
In the Test scope, the spelling errors should be marked as typos (green)
This is how it’s done.
Creating scopes
Repeat this process to create the Production scope.
Creating inspection profile with these scopes
Next, let’s create a copy of the default profile (though this profile is editable. just to be on the safe side):
and give it a new name, for example, MyProjectProfile. This new profile is a copy of the default one, and has the same set of inspections.
With this new profile selected, let’s locate the Spelling inspection and change it. To find the Spelling inspection (we’ve already done it before), just type spel in the search area.
What’s next? Click In All Scopes button and select the Test scope from the list; repeat same for the Production scope
In the scope «Test», the inspection severity is left as-is (a typo); however, the scope «Production» we’ll choose «Error» from the list of severities:
Mind the color code of inspections. They are shown black if unchanged. If they are blue, then it means that they have been changed.
Apply changes and close the dialog.
Highlighting errors
Besides coding style violations, PyCharm highlights the other errors too, depending on the selected profile.
Refer to the product documentation.
Generating source code
First, create an instance of a class:
Next, press Alt+Enter and choose the intention action Create class ‘Solver’ :
Great! PyCharm has stubbed out a class:
Next, let’s add a method to the class instance. To do that, type a dot after class instance, and then type the method name. This method does not yet exist, and PyCharm suggests to create one:
So, we’ve come to the source code like this:
Let’s surround a block of code with if construct. Select the statements to be completed, when d is non-negative, and press Ctrl+Alt+T (or choose Code | Surround with on the main menu):
Select if option from the suggestion list. As you see, PyCharm automatically adds if True: and indents the selected lines:
When you press Enter again, the caret rests at the indented position. Here you can type the exception expression, using PyCharm’s powerful automatic code completion:
Reformatting code
Let’s look again at our Solver.py file. Its right gutter shows yellow stripes. When you hover your mouse pointer over a stripe, PyCharm shows the description of the corresponding problem in the code:
The good news is that they are but warnings, and won’t affect the results. Bad news is they are too numerous to fix each one by one. Is it possible to make the source code nice and pretty without much fuss?
Note that you can define formatting rules yourself. To do that, open the code style settings, select language (in this case, Python), and make the necessary changes:
Adding documentation comments
OK, formatting is fixed now, but there are still some stripes left. The inevitable yellow light bulb shows the possibility to add a docstring comment:
Choose this suggestion and see the docstring comment for a certain parameter added:
Note that you have to select the checkbox Insert type placeholders in documentation comment strings in the Smart Keys page of the Editor settings:
There are several docstring formats, and the documentation comments are created in the format, which you have selected in the Python Integrated Tools page. If you so wish, you can change the docstring format to, say, Epytext or plain text.
Type hinting
The documentation comments can be used to define the expected types of parameters, return values, or local variables. Why do we need it all? For example, we’d like to keep under control the types of parameters we pass to the demo() method. To do that, let’s add the corresponding information to the documentation comment (By the way, mind code completion in the documentation comments!):
Next, when you look at the method invocation, you see that the wrong parameter is highlighted by the PyCharm’s inspection Type Checker :
Learn more about type hinting in the PyCharm documentation.
2.2. Практикум¶
2.2.1. Установка и настройка¶
В настоящем курсе используются Python 3.5, Geany 1.30, Atom 1.23 и PyCharm 2019, однако могут быть установлены и их более свежие версии.
2.2.1.1. Python¶
Для установки Python необходимо выполнить ряд действий в зависимости от ОС:
определить разрядность ОС (32- или 64-битная, инструкции для Windows, Mac OS X или Linux);
открыть страницу загрузки (общая) и загрузить соответствующий дистрибутив;
выполнить установку (при установке на ОС Windows необходимо установить флажок Add python.exe to PATH во время установки).
В дистрибутивах Linux с пакетным менеджером, удобнее использовать его команды, например:
После установки запустите терминал и убедитесь, что необходимая версия Python установлена.
2.2.1.1.1. Дополнительные пакеты¶
Задания, выполняемые на Python, должны проходить автоматическую проверку (валидацию) и соответствовать стандарту оформления PEP 8. Для поддержки этой возможности откройте терминал в папке с tests (в папке с заданиями) и выполните команду установки:
Запуск проверки отдельно для каждой IDE описан далее.
2.2.1.2. IDE¶
В рамках курса возможности Atom, Geany и PyCharm не отличаются, поэтому выбор остается за Вами: Atom и PyCharm являются более современными и популярными IDE, в то время как Geany обладает необходимыми возможностями и поддерживает русский язык в интерфейсе.
В курсе достаточно использовать одну из IDE.
2.2.1.2.1. Atom¶
Для установки необходимо перейти на официальный сайт Atom и загрузить предложенный дистрибутив.
Назначение / Что можно найти?
Все доступные команды IDE
Список открытых файлов
Дерево файлов проекта
Набор кода с подсветкой синтаксиса и прочими удобствами
Удобное отображение структуры файла
Информация о запуске программы, ошибках в стандарте оформления и т.д.
Информация о файле: кодировка, положение курсора в редакторе кода и т.д.
Некоторые из элементов главного окна отобразятся после дополнительной настройки.
2.2.1.2.1.1. Настройка отступов и пробелов¶
установлен флажок «Show Indent Guide»;
установлен флажок «Show Invisibles»;
установлен флажок «Soft Wrap».
2.2.1.2.1.2. Установка и настройка пакетов¶
Дополнительно необходимо установить следующие пакеты:
minimap: «мини-карта» документа;
linter-flake8: проверка на соответствие кода стандарту PEP 8;
autocomplete-python: интерактивная подсказка синтаксиса языка;
atom-python-run: запуск программы из редактора.
Установку дополнений можно произвести (1) из терминала или (2) в графическом интерфейсе.
Откройте терминал и введите команду:
В главном окне Atom:
для каждого пакета:
в текстовом поле Search packages введите имя пакета и нажмите для его поиска;
установите найденный пакет, нажав на кнопку Install; в случае дополнительных запросов на установку зависимых пакетов (dependencies) необходимо ответить Yes.
2.2.1.2.1.3. Автоматическая проверка заданий и PEP8¶
Установленные плагины позволяют автоматически выполнять проверку на соответствие кода стандарту PEP 8, отображая ошибки в окне сообщений.
После настройки используйте команды:
F5: запуск программы на выполнение;
F6: запуск автоматической проверки решенной задачи (см. пример: Цикл выполнения и защиты заданий ).
2.2.1.2.2. Geany¶
Для установки Geany необходимо выполнить следующие шаги в зависимости от операционной системы.
на официальном сайте Geany перейти в раздел Download/Releases, загрузить соответствующий дистрибутив ( geany-1.X_setup.exe или geany-1.X_osx.dmg ) и выполнить установку;
только для Windows(!): на официальном сайте плагинов Geany перейти в раздел Downloads, загрузить дистрибутив, соответствующий по версии установленной Geany ( geany-plugins-1.X_setup.exe ) и выполнить установку.
В дистрибутивах Linux с пакетным менеджером, удобнее использовать его команды, например:
Для других дистрибутивов:
на официальном сайте Geany перейти в раздел Download/Third Party Packages и выполнить инструкции для своего дистрибутива Linux;
на официальном сайте плагинов Geany перейти в раздел Installation и выполнить инструкции для своего дистрибутива Linux.
Назначение / Что можно найти?
Все доступные команды IDE
Быстрый доступ к командам работы с файлами, а также запуску программ
Список открытых файлов
Отображение идентификаторов программы, дерева файлов и т.д.
Набор кода с подсветкой синтаксиса и прочими удобствами
Удобное отображение структуры файла
Информация о запуске программы или о выполнении прочих команд
Информация о файле: кодировка, положение курсора в редакторе кода и т.д.
Некоторые из элементов главного окна отобразятся после дополнительной настройки.
2.2.1.2.2.1. Настройка отступов и пробелов¶
вкладка Редактор (Editor):
вкладка Возможности (Features):
установлен флажок «Новая строка убирает лишние пробелы» («Newline strips trailing spaces»);
поле «Маркер переключения комментариев» («Comment toggle marker») установлено в 1 пробел.
вкладка Отступы (Indentation):
снят флажок «Отступ при помощи клавиши Tab» («Tab key indents»).
вкладка Отображение (Display):
установлен флажок «Показывать индикаторы отступа» («Show indentation guides»);
установлен флажок «Показывать пробелы» («Show white space»).
вкладка Файлы (Files):
Сохранение файлов (Saving Files):
установлен флажок «Убирать лишние пробелы и табуляции» («Strip trailing spaces and tabs»);
установлен флажок «Заменять табуляции пробелами» («Replace tabs with space»).
2.2.1.2.2.2. Включение и настройка модулей¶
Overview: отображает «мини-карту» документа;
Авто-маркер (Auto-mark): подсвечивает текущее слово под курсором;
Дерево файлов (TreeBrowser): показывает дерево файлов на боковой панели слева;
Дополнения (Addons): маленькие удобства, например, панель задач, обрамление выделенного текста и т.д.
вкладка Дополнения (Addons):
установите флажок «Удалять пустые строки в конце файла при сохранении» («Strip trailing blank lines»).
2.2.1.2.2.3. Автоматическая проверка заданий и PEP8¶
После настройки используйте команды:
F5: запуск программы на выполнение;
PEP8 (или Lint) в меню Сборка: запуск проверки текущего файла на соответствие PEP8 с отображением возможных ошибок в окне сообщений красным цветом (данную проверку и устранение ошибок рекомендуется осуществлять регулярно);
Проверить в меню Сборка: запуск автоматической проверки решенной задачи (см. пример: Цикл выполнения и защиты заданий ).
2.2.1.2.3. PyCharm¶
Для установки необходимо перейти на официальный сайт PyCharm и загрузить предложенный дистрибутив (Community Edition).
Назначение / Что можно найти?
Все доступные команды IDE
Список открытых файлов
Дерево файлов проекта
Набор кода с подсветкой синтаксиса и прочими удобствами
Удобное отображение структуры файла
Интерактивная консоль запуска программы
Информация о файле: кодировка, положение курсора в редакторе кода и т.д.
2.2.1.2.3.1. Запуск и автоматическая проверка заданий и PEP8¶
PyCharm автоматически проверяет код на соответствие стандарту PEP 8, используя подчеркивание в редакторе кода (Рисунок 2.2.6).
Для быстрого запуска и проверки выполняемых заданий необходимо выполнить ряд настроек.
Для возможности запуска задания добавьте (через кнопку +) возможность запуска программы (Рисунок 2.2.8) и нажмите OK.
Для добавления сочетания клавиш:
выделите строку с командой;
вызовите контекстное меню и выберите пункт Add Keyboard Shortcut;
в случае предупреждения, что горячая клавиша уже занята, нажмите Remove (в дальнейшем сочетания можно будет сбросить к начальным настройкам при необходимости).
2.2.1.2.4. Сочетания клавиш¶
Некоторые полезные сочетания клавиш приведены в Таблице 2.2.4.
Запуск автоматической проверки
Дублирование текущей строки
2.2.1.2.5. Дополнительные советы¶
Использование кириллицы и пробелов
Старайтесь избегать использования кириллицы и пробелов при наименовании имен файлов и идентификаторов в программе.
Для вновь создаваемого файла IDE устанавливает кодировку в UTF-8, которая как раз требуется для файлов исходного кода Python, и указывает это в строке состояния. Если файл определяется в другой кодировке (такое бывает, например, если создать файл в блокноте ОС Windows), ее необходимо поменять, выполнив следующие действия:
Atom: щелкнуть в строке состояния на текущую кодировку файла и выбрать UTF-8,
PyCharm: щелкнуть в строке состояния на текущую кодировку файла и выбрать UTF-8
после чего сохранить файл.
Совмещение пробелов и знаков табуляции
Python не позволяет использовать одновременно пробелы и знаки табуляции в качестве разделителей, выдавая ошибку
Данную проблему можно решить, используя замену (Рисунок 2.2.11).
2.2.2. Написание программ¶
2.2.2.1. Python¶
Для запуска интерпретатора Python откройте терминал и введите команду python (или python3 ), после чего интерпретатор будет запущен и перейдет в интерактивный режим, ожидая ввода команд (Рисунок 2.2.12).
Введите в консоли по очереди команды, приведенные в Листинге 2.2.1. Комментарии вводить не обязательно. Один из возможных результатов выполнения приведен на Рисунке 2.2.14.
Даже если не знать синтаксис Python, благодаря его «простоте», можно понять, что происходит в программе.
2.2.2.2. IDE¶
В случае, когда программу требуется сохранить и периодически изменять, удобнее будет работать в IDE.
2.2.2.2.1. Atom¶
Для создания и запуска программы необходимо выполнить нескольких шагов:
Наберите текст программы из Листинга 2.2.1.
Для запуска программы нажмите клавишу F5.
Протестируйте работу программы, запустив ее несколько раз, введя различные входные данные.
Проверьте, исправьте возможные стилевые ошибки (до исчезания соответствующего окна сообщений) и сохраните окончательный вариант программы (Рисунок 2.2.15).
2.2.2.2.2. Geany¶
Для создания и запуска программы необходимо выполнить нескольких шагов:
Наберите текст программы из Листинга 2.2.1.
Для запуска программы нажмите клавишу F5 или кнопку Выполнить на панели инструментов.
Протестируйте работу программы, запустив ее несколько раз, введя различные входные данные.
2.2.2.2.3. PyCharm¶
PyCharm использует концепцию проектов, поэтому в первую очередь необходимо создать пустой проект, и, введя его название, нажать кнопку OK (Рисунок 2.2.17).
После открытия проекта необходимо выполнить нескольких шагов:
Выберите Python File и введите имя файла (например, ‘main.py’ ), после чего подтвердите создание нажатием кнопки OK.
Наберите текст программы из Листинга 2.2.1.
Для запуска программы нажмите клавишу F5.
Протестируйте работу программы, запустив ее несколько раз, введя различные входные данные.
Проверьте, исправьте возможные стилевые ошибки (до исчезания подчеркиваний в редакторе кода) и сохраните окончательный вариант программы (Рисунок 2.2.18).
2.2.2.2.4. Автоматическая проверка заданий¶
2.2.3. Получение справочной информации¶
Исчерпывающая документация по языку программирования Python находится на официальном сайте в разделе документации или в папке Doc (куда был установлен Python). Воспользуйтесь поиском, когда необходимо найти описание неизвестной функции или ознакомиться с ее поведением (Рисунок 2.2.19).
Еще одним (и возможно более простым) способом получения справочной информации является использование функции help() (Рисунок 2.2.20)
Используя заготовку, сохраните как:
desktop_python_terminal.png : скриншот рабочего стола с запущенным интерпретатором Python c указанием версии и набранной программой из Листинга 2.2.1;
desktop_ide_terminal.png : скриншот рабочего стола с запущенной IDE (с набранной программой из Листинга 2.2.1), а также терминала с результатом запуска;
task_02_02_01.py : файл с текстом программы из Листинга 2.2.1;