mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 18:15:28 +03:00
docs
This commit is contained in:
@@ -3,24 +3,21 @@
|
||||
Переопределение стандартного вывода
|
||||
===================================
|
||||
|
||||
О разделе
|
||||
~~~~~~~~~
|
||||
|
||||
``Argenta`` предоставляет гибкие механизмы для управления форматированием вывода, включая использование динамических разделительных линий. Это достигается за счет перехвата стандартного потока вывода (``stdout``), что имеет свои особенности.
|
||||
``Argenta`` предоставляет гибкие механизмы для форматирования вывода, включая динамические разделительные линии. Это достигается за счёт перехвата стандартного потока вывода (``stdout``), что накладывает некоторые особенности.
|
||||
|
||||
-----
|
||||
|
||||
Механизм перехвата ``stdout``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
По умолчанию ``Argenta`` перехватывает весь текст, который выводится в ``stdout`` внутри обработчика команды (``handler``). Это делается для реализации **динамической длины разделителя**. Система анализирует весь выведенный текст, находит самую длинную строку и использует её длину для отрисовки верхней и нижней разделительных линий. Это создает аккуратный и визуально согласованный интерфейс, где вывод команды "обернут" в рамку, идеально подогнанную под его содержимое.
|
||||
По умолчанию ``Argenta`` перехватывает весь текст, выводимый в ``stdout`` внутри обработчика команды. Это необходимо для реализации **динамических разделителей**: система анализирует вывод, находит самую длинную строку и использует её для отрисовки верхней и нижней границ. Такой подход создаёт аккуратный интерфейс, где вывод команды «обёрнут» в рамку, подогнанную под его содержимое.
|
||||
|
||||
-----
|
||||
|
||||
Побочные эффекты перехвата ``stdout``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Главный побочный эффект этого механизма проявляется при использовании функций, которые одновременно ожидают ввод от пользователя и выводят текст-приглашение. Классический пример — стандартная функция ``input()``.
|
||||
Главный побочный эффект этого механизма проявляется при использовании функций, которые одновременно ожидают ввод от пользователя и выводят приглашение в консоль. Классический пример — стандартная функция ``input()``.
|
||||
|
||||
.. code-block:: python
|
||||
:linenos:
|
||||
@@ -30,44 +27,44 @@
|
||||
print(f"Привет, {user_name}!")
|
||||
|
||||
.. warning::
|
||||
При включенном перехвате ``stdout`` текст-приглашение ``"Введите ваше имя: "`` **не будет выведен в консоль немедленно**. Он попадет в буфер, и пользователь увидит только мигающий курсор, ожидающий ввода. Текст приглашения будет выведен только после того, как выполнение всего обработчика завершится, вместе с остальным буферизованным выводом. Это может сбить пользователя с толку и является пограничным случаем, требующим внимания при разработке.
|
||||
При включённом перехвате ``stdout`` текст-приглашение (например, ``"Введите ваше имя: "``) **не будет выведен в консоль немедленно**. Он попадёт в буфер, и пользователь увидит только мигающий курсор. Текст приглашения отобразится лишь после завершения работы обработчика вместе с остальным выводом. Это может сбить пользователя с толку.
|
||||
|
||||
-----
|
||||
|
||||
Отключение перехвата ``stdout`` с помощью ``disable_redirect_stdout``
|
||||
---------------------------------------------------------------------
|
||||
|
||||
Чтобы решить проблему с ``input()`` и другими подобными функциями, в конструкторе класса ``Router`` предусмотрен специальный аргумент:
|
||||
Чтобы решить эту проблему, в конструкторе ``Router`` предусмотрен специальный аргумент:
|
||||
|
||||
* **disable_redirect_stdout** (``bool``, по умолчанию ``False``)
|
||||
|
||||
Если при создании роутера установить ``disable_redirect_stdout=True``, то для всех команд этого роутера механизм перехвата ``stdout`` будет отключен.
|
||||
Если при создании роутера установить ``disable_redirect_stdout=True``, механизм перехвата ``stdout`` будет отключён для всех его обработчиков.
|
||||
|
||||
.. literalinclude:: ../code_snippets/redirect_stdout/sample.py
|
||||
:language: python
|
||||
:linenos:
|
||||
|
||||
В этом случае ``input()`` будет работать как обычно, и пользователь сразу увидит приглашение "Как вас зовут?".
|
||||
В этом случае ``input()`` будет работать как обычно, и пользователь сразу увидит приглашение к вводу.
|
||||
|
||||
-----
|
||||
|
||||
Типы разделительных линий
|
||||
--------------------------
|
||||
|
||||
``Argenta`` поддерживает два типа разделительных линий, которые можно настроить при инициализации ``App``:
|
||||
``Argenta`` поддерживает два типа разделителей, которые настраиваются при инициализации ``App``:
|
||||
|
||||
1. **DynamicDividingLine()**
|
||||
* Это поведение по умолчанию. Длина линии динамически подстраивается под самый длинный выведенный текст.
|
||||
* Требует включенного перехвата ``stdout`` (т.е. ``disable_redirect_stdout=False`` на роутере).
|
||||
* Поведение по умолчанию. Длина линии динамически подстраивается под самый длинный текст в выводе.
|
||||
* Требует включённого перехвата ``stdout`` (``disable_redirect_stdout=False`` в роутере).
|
||||
|
||||
2. **StaticDividingLine(length: int = 25)**
|
||||
* Линия имеет фиксированную длину (по умолчанию 25 символов), которую можно настроить через аргумент `length`.
|
||||
* Используется автоматически для роутеров, где ``disable_redirect_stdout=True``, так как без перехвата вывода невозможно определить необходимую динамическую длину.
|
||||
* Линия имеет фиксированную длину (по умолчанию 25 символов), которую можно задать через аргумент `length`.
|
||||
* Используется принудительно для роутеров с ``disable_redirect_stdout=True``, так как без перехвата вывода невозможно определить динамическую длину.
|
||||
|
||||
Настройка разделительной линии в `App`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Вы можете глобально задать тип разделительной линии для всего приложения через аргумент ``dividing_line`` в конструкторе ``App``.
|
||||
Вы можете глобально задать тип разделителя для всего приложения через аргумент ``dividing_line`` в конструкторе ``App``.
|
||||
|
||||
.. literalinclude:: ../code_snippets/redirect_stdout/sample2.py
|
||||
:language: python
|
||||
@@ -103,4 +100,4 @@
|
||||
- Статическая линия указанной длины
|
||||
- Да
|
||||
|
||||
Таким образом, для создания интерактивных команд, требующих ввода от пользователя, всегда отключайте перехват ``stdout`` на соответствующем роутере. Для всех остальных команд можно оставить поведение по умолчанию.
|
||||
Таким образом, для интерактивных команд, требующих ввода от пользователя, отключайте перехват ``stdout`` на уровне роутера. Для всех остальных команд можно оставить поведение по умолчанию.
|
||||
|
||||
Reference in New Issue
Block a user