# Автоформатирование в ROS2 python

Настройка автоформатирования для Python-пакетов в ROS 2 помогает поддерживать единый стиль кода и автоматически исправлять нарушения PEP 8. Вот пошаговая инструкция по настройке.

***

### **1. Установка инструментов форматирования**

Для Python в ROS 2 чаще всего используют:

* **`black`** — автоматическое форматирование по PEP 8.
* **`flake8`** или **`pylint`** — линтинг (проверка стиля и ошибок).
* **`isort`** — автоматическая сортировка импортов.
* **`pre-commit`** — автоматический запуск форматирования перед коммитом.

Установите их:

```bash
pip install black flake8 pylint isort pre-commit
```

***

### **2. Настройка `pre-commit` (рекомендуется)**

`pre-commit` запускает форматирование перед каждым `git commit`.

#### **Шаг 1: Создайте `.pre-commit-config.yaml`**

В корне вашего ROS 2-пакета (`src/your_package/`) создайте файл:

```yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0
    hooks:
      - id: trailing-whitespace  # удаляет пробелы в конце строк
      - id: end-of-file-fixer    # гарантирует одну пустую строку в конце файла
      - id: check-yaml           # проверяет синтаксис YAML
      - id: check-added-large-files  # блокирует случайный коммит больших файлов

  - repo: https://github.com/psf/black
    rev: 23.12.1
    hooks:
      - id: black
        args: [--line-length=88]  # как у PEP 8

  - repo: https://github.com/PyCQA/isort
    rev: 5.12.0
    hooks:
      - id: isort
        args: ["--profile", "black"]  # совместимость с black

  - repo: https://github.com/PyCQA/flake8
    rev: 6.1.0
    hooks:
      - id: flake8
        args: [--max-line-length=88, --ignore=E203,W503]
```

#### **Шаг 2: Активируйте `pre-commit`**

```bash
pre-commit install  # теперь форматирование будет запускаться при git commit
```

#### **Шаг 3: Проверьте вручную**

```bash
pre-commit run --all-files  # примените ко всем файлам
```

***

### **3. Настройка `black` и `isort` (если не используете `pre-commit`)**

#### **Создайте `pyproject.toml`**

В корне пакета добавьте:

```toml
[tool.black]
line-length = 88
target-version = ['py38']  # или ваша версия Python

[tool.isort]
profile = "black"
line_length = 88
```

#### **Форматирование вручную**

```bash
black .  # автоформатирование всех .py-файлов
isort .  # сортировка импортов
flake8 .  # проверка стиля
```

***

### **4. Интеграция с `colcon` (опционально)**

Чтобы форматирование запускалось при сборке, можно добавить хук в `CMakeLists.txt` (для Python-пакетов с `ament_python`):

#### **Добавьте в `setup.py` или `setup.cfg`**

```python
from setuptools import setup

setup(
    # ...
    install_requires=["black", "isort", "flake8"],  # если нужны в зависимостях
)
```

#### **Или добавьте тест в `CMakeLists.txt`**

```cmake
# Если используете ament_cmake
find_package(ament_cmake REQUIRED)
find_package(ament_cmake_python REQUIRED)

# Добавьте проверку стиля как тест
if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()
```

***

### **5. Настройка в VS Code (опционально)**

Для автоматического форматирования в редакторе:

1. Установите расширения:
   * **Python** (Microsoft)
   * **Black Formatter**
   * **isort**
   * **flake8**
2. Добавьте в `settings.json`:

```json
{
  "python.formatting.provider": "black",
  "python.formatting.blackArgs": ["--line-length=88"],
  "python.linting.flake8Enabled": true,
  "python.linting.flake8Args": ["--max-line-length=88", "--ignore=E203,W503"],
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.organizeImports": true
  }
}
```

***

### **Итог**

* **`pre-commit`** — лучший способ автоматизировать форматирование перед коммитом.
* **`black` + `isort` + `flake8`** — стандартный набор для ROS 2 Python-пакетов.
* **Интеграция с `colcon`** позволяет проверять стиль при сборке.
* **Настройка VS Code** ускоряет разработку.

Теперь ваш код будет всегда в едином стиле! 🚀


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://alice-and-alex-docs.gitbook.io/alice_and_alex_docs/ros2-development/avtoformatirovanie-v-ros2-python.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
