Документация Python неофициальный перевод

select.md

364 строк · 33.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.6/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.3. [`select`](https://python-all.ru/3.6/library/select.html#module-select) – ожидание завершения ввода-вывода89---1011Этот модуль предоставляет доступ к функциям `select()` и `poll()`, доступным в большинстве операционных систем, `devpoll()` – на Solaris и производных, `epoll()` – на Linux 2.5+ и `kqueue()` – на большинстве BSD. Обратите внимание: в Windows он работает только с сокетами; в других ОС он также работает с другими типами файлов (в частности, в Unix – с каналами). Его нельзя использовать для обычных файлов, чтобы определить, увеличился ли файл с момента последнего чтения.1213> **Примечание**14>15> Модуль [`selectors`](https://python-all.ru/3.6/library/selectors.html#module-selectors) предоставляет высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на примитивах модуля [`select`](https://python-all.ru/3.6/library/select.html#module-select). Пользователям рекомендуется использовать модуль [`selectors`](https://python-all.ru/3.6/library/selectors.html#module-selectors), если только им не требуется точный контроль над используемыми низкоуровневыми примитивами ОС.1617Модуль определяет следующее:1819#### `exception select.error`2021Устаревший псевдоним [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError).2223Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.6/library/select.html) этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError).2425#### `select.devpoll()`2627Поддерживается только на Solaris и производных. Возвращает объект `/dev/poll` опроса; см. раздел [/dev/poll Polling Objects](https://python-all.ru/3.6/library/select.html#devpoll-objects) ниже для методов, поддерживаемых объектами devpoll.2829Объекты `devpoll()` привязаны к количеству файловых дескрипторов, разрешённых на момент создания. Если программа уменьшает это значение, `devpoll()` завершится ошибкой. Если программа увеличивает это значение, `devpoll()` может вернуть неполный список активных файловых дескрипторов.3031Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.6/library/os.html#fd-inheritance).3233Новое в версии 3.3.3435Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.3637#### `select.epoll(sizehint=-1, flags=0)`3839Поддерживается только на Linux 2.5.44 и новее. Возвращает объект опроса, работающий по фронту (edge polling), который можно использовать как интерфейс с триггером по фронту или уровню для событий ввода-вывода.4041Параметр *sizehint* сообщает epoll ожидаемое количество регистрируемых событий. Он должен быть положительным, либо *-1* для использования значения по умолчанию. Он используется только в старых системах, где `epoll_create1()` недоступен; в противном случае он не имеет эффекта (хотя его значение по-прежнему проверяется).4243Параметр *flags* устарел и полностью игнорируется. Однако, если он указан, его значение должно быть `0` или `select.EPOLL_CLOEXEC`, иначе возбуждается `OSError`.4445См. раздел [Edge and Level Trigger Polling (epoll) Objects](https://python-all.ru/3.6/library/select.html#epoll-objects) ниже для методов, поддерживаемых объектами epoll.4647Объекты `epoll` поддерживают протокол менеджера контекста: при использовании в инструкции [`with`](https://python-all.ru/3.6/reference/compound_stmts.html#with) новый файловый дескриптор автоматически закрывается в конце блока.4849Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.6/library/os.html#fd-inheritance).5051Изменено в версии 3.3: Добавлен параметр *flags*.5253Изменено в версии 3.4: Добавлена поддержка инструкции [`with`](https://python-all.ru/3.6/reference/compound_stmts.html#with). Теперь новый файловый дескриптор является ненаследуемым.5455Устарело с версии 3.4: Параметр *flags*. Теперь по умолчанию используется `select.EPOLL_CLOEXEC`. Используйте [`os.set_inheritable()`](https://python-all.ru/3.6/library/os.html#os.set_inheritable), чтобы сделать файловый дескриптор наследуемым.5657#### `select.poll()`5859Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел [Polling Objects](https://python-all.ru/3.6/library/select.html#poll-objects) ниже для методов, поддерживаемых объектами опроса.6061#### `select.kqueue()`6263Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел [Kqueue Objects](https://python-all.ru/3.6/library/select.html#kqueue-objects) ниже для методов, поддерживаемых объектами kqueue.6465Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.6/library/os.html#fd-inheritance).6667Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.6869#### `select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)`7071Поддерживается только на BSD. Возвращает объект события ядра; см. раздел [Kevent Objects](https://python-all.ru/3.6/library/select.html#kevent-objects) ниже для методов, поддерживаемых объектами kevent.7273#### `select.select(rlist, wlist, xlist[, timeout])`7475Это простой интерфейс к системному вызову `select()` Unix. Первые три аргумента – последовательности «ожидаемых объектов»: целые числа, представляющие файловые дескрипторы, или объекты с методом без параметров [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno), возвращающим такое целое число:7677- *rlist*: ожидать готовности к чтению78- *wlist*: ожидать готовности к записи79- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)8081Пустые последовательности допускаются, но поддержка трёх пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в секундах как число с плавающей запятой. Если аргумент *timeout* опущен, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Нулевой тайм-аут соответствует опросу, без блокировки.8283Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.8485Среди допустимых типов объектов в последовательностях – [файловые объекты](https://python-all.ru/3.6/glossary.html#term-file-object) Python (например, `sys.stdin` или объекты, возвращаемые [`open()`](https://python-all.ru/3.6/library/functions.html#open) или [`os.popen()`](https://python-all.ru/3.6/library/os.html#os.popen)), сокеты, возвращаемые [`socket.socket()`](https://python-all.ru/3.6/library/socket.html#socket.socket). Можно также определить собственный класс-*обёртку*, если у него есть соответствующий метод [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno) (который действительно возвращает файловый дескриптор, а не просто произвольное целое число).8687> **Примечание**88>89> Файловые объекты в Windows недопустимы, но сокеты – да. В Windows базовая функция `select()` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не происходящие из WinSock.9091Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.6/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.6/library/exceptions.html#InterruptedError).9293#### `select.PIPE_BUF`9495Минимальное количество байт, которое можно записать в канал без блокировки, когда канал сообщён как готовый к записи с помощью [`select()`](https://python-all.ru/3.6/library/select.html#select.select), [`poll()`](https://python-all.ru/3.6/library/select.html#select.poll) или другого интерфейса в этом модуле. Это не относится к другим файлоподобным объектам, таким как сокеты.9697Это значение гарантируется POSIX как минимум 512. Доступность: Unix.9899Новое в версии 3.2.100101## 18.3.1. `/dev/poll`Объекты опроса (Polling)102103Solaris и их производные имеют `/dev/poll`. В то время как `select()` работает за O(наибольший файловый дескриптор), а `poll()` – за O(количество файловых dескрипторов), `/dev/poll` работает за O(активные файловые дескрипторы).104105Поведение `/dev/poll` очень близко к стандартному объекту `poll()`.106107#### `devpoll.close()`108109Закрывает файловый дескриптор объекта опроса.110111Новое в версии 3.4.112113#### `devpoll.closed`114115`True` если объект опроса закрыт.116117Новое в версии 3.4.118119#### `devpoll.fileno()`120121Возвращает номер файлового дескриптора объекта опроса.122123Новое в версии 3.4.124125#### `devpoll.register(fd[, eventmask])`126127Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.6/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.128129*eventmask* – необязательная битовая маска, описывающая тип событий для проверки. Константы те же, что и у объекта `poll()`. Значение по умолчанию – комбинация констант `POLLIN`, `POLLPRI` и `POLLOUT`.130131> **Предупреждение**132>133> Регистрация уже зарегистрированного файлового дескриптора не является ошибкой, но результат не определен. Правильным действием будет сначала отменить регистрацию или изменить его. Это важное отличие от `poll()`.134135#### `devpoll.modify(fd[, eventmask])`136137Этот метод выполняет [`unregister()`](https://python-all.ru/3.6/library/select.html#select.devpoll.unregister), а затем [`register()`](https://python-all.ru/3.6/library/select.html#select.devpoll.register). Это (немного) эффективнее, чем делать то же самое явно.138139#### `devpoll.unregister(fd)`140141Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.6/library/select.html#select.devpoll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno), возвращающим целое число.142143Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, безопасно игнорируется.144145#### `devpoll.poll([timeout])`146147Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи `(fd, event)` из двух элементов для дескрипторов, по которым есть события или ошибки. *fd* – это файловый дескриптор, а *event* – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` указывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан *timeout*, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если *timeout* опущен, равен -1 или [`None`](https://python-all.ru/3.6/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта poll.148149Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.6/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.6/library/exceptions.html#InterruptedError).150151## 18.3.2. Объекты epoll (опроса с фронтальным и уровнем сигналом)152153> [http://linux.die.net/man/4/epoll](https://python-all.ru/3.6/library/select.html)154>155> *eventmask*156>157> | Константа | Значение |158> | --- | --- |159> | `EPOLLIN` | Доступен для чтения |160> | `EPOLLOUT` | Доступен для записи |161> | `EPOLLPRI` | Срочные данные для чтения |162> | `EPOLLERR` | Возникла ошибка на ассоциированном файловом дескрипторе |163> | `EPOLLHUP` | Произошёл разрыв соединения на ассоциированном файловом дескрипторе |164> | `EPOLLET` | Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger) |165> | `EPOLLONESHOT` | Установить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается. |166> | `EPOLLEXCLUSIVE` | Пробуждать только один объект epoll, когда связанный fd имеет событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, ожидающие на fd. |167> | `EPOLLRDHUP` | Потоковый сокет: удаленная сторона закрыла соединение или завершила записывающую половину соединения. |168> | `EPOLLRDNORM` | Эквивалентно `EPOLLIN` |169> | `EPOLLRDBAND` | Полоса приоритетных данных доступна для чтения. |170> | `EPOLLWRNORM` | Эквивалентно `EPOLLOUT` |171> | `EPOLLWRBAND` | Приоритетные данные могут быть записаны. |172> | `EPOLLMSG` | Игнорируется. |173174#### `epoll.close()`175176Закрывает управляющий файловый дескриптор объекта epoll.177178#### `epoll.closed`179180`True`, если объект epoll закрыт.181182#### `epoll.fileno()`183184Возвращает номер файлового дескриптора управляющего fd.185186#### `epoll.fromfd(fd)`187188Создает объект epoll из заданного файлового дескриптора.189190#### `epoll.register(fd[, eventmask])`191192Регистрирует файловый дескриптор в объекте epoll.193194#### `epoll.modify(fd, eventmask)`195196Изменяет зарегистрированный файловый дескриптор.197198#### `epoll.unregister(fd)`199200Удаляет зарегистрированный файловый дескриптор из объекта epoll.201202#### `epoll.poll(timeout=-1, maxevents=-1)`203204Ожидает события. timeout в секундах (float)205206Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.6/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.6/library/exceptions.html#InterruptedError).207208## 18.3.3. Объекты опроса209210Системный вызов `poll()`, поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. `poll()` масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как `select()` строит битовую маску, устанавливает биты для нужных файловых дескрипторов, а затем всю битовую маску приходится снова линейно сканировать. `select()` имеет сложность O(наибольший файловый дескриптор), а `poll()` – O(количество файловых дескрипторов).211212#### `poll.register(fd[, eventmask])`213214Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.6/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.215216*eventmask* – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.217218| Константа | Значение |219| --- | --- |220| `POLLIN` | Есть данные для чтения |221| `POLLPRI` | Есть срочные данные для чтения |222| `POLLOUT` | Готов к выводу: запись не будет блокироваться |223| `POLLERR` | Условие ошибки (какого-либо рода) |224| `POLLHUP` | Разъединение |225| `POLLRDHUP` | Потоковый сокет: удаленная сторона закрыла соединение или закрыла запись в половине соединения |226| `POLLNVAL` | Некорректный запрос: дескриптор не открыт |227228Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.229230#### `poll.modify(fd, eventmask)`231232Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и `register(fd, eventmask)`. Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError) с errno `ENOENT`.233234#### `poll.unregister(fd)`235236Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.6/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno), возвращающим целое число.237238Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`KeyError`](https://python-all.ru/3.6/library/exceptions.html#KeyError).239240#### `poll.poll([timeout])`241242Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи `(fd, event)` из двух элементов для дескрипторов, по которым есть события или ошибки. *fd* – это файловый дескриптор, а *event* – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` указывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан *timeout*, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если *timeout* опущен, отрицателен или равен [`None`](https://python-all.ru/3.6/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта poll.243244Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.6/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.6/library/exceptions.html#InterruptedError).245246## 18.3.4. Объекты Kqueue247248#### `kqueue.close()`249250Закрывает файловый дескриптор управления объекта kqueue.251252#### `kqueue.closed`253254`True`, если объект kqueue закрыт.255256#### `kqueue.fileno()`257258Возвращает номер файлового дескриптора управляющего fd.259260#### `kqueue.fromfd(fd)`261262Создаёт объект kqueue из заданного файлового дескриптора.263264#### `kqueue.control(changelist, max_events[, timeout=None]) → eventlist`265266Низкоуровневый интерфейс к kevent267268- changelist должен быть итерируемым объектом kevent или `None`269- max\_events должен быть 0 или положительным целым числом270- тайм-аут в секундах (возможны числа с плавающей запятой)271272Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.6/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.6/library/exceptions.html#InterruptedError).273274## 18.3.5. Объекты Kevent275276[https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/3.6/library/select.html)277278#### `kevent.ident`279280Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть либо целым числом, либо объектом с методом [`fileno()`](https://python-all.ru/3.6/library/io.html#io.IOBase.fileno). kevent хранит целое число внутри.281282#### `kevent.filter`283284Имя фильтра ядра.285286| Константа | Значение |287| --- | --- |288| `KQ_FILTER_READ` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |289| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает управление при появлении возможности записи |290| `KQ_FILTER_AIO` | Запросы AIO |291| `KQ_FILTER_VNODE` | Возвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в *fflag* |292| `KQ_FILTER_PROC` | Отслеживание событий по идентификатору процесса |293| `KQ_FILTER_NETDEV` | Отслеживание событий на сетевом устройстве \[недоступно в Mac OS X\] |294| `KQ_FILTER_SIGNAL` | Возвращает управление при доставке отслеживаемого сигнала процессу |295| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер |296297#### `kevent.flags`298299Действие фильтра.300301| Константа | Значение |302| --- | --- |303| `KQ_EV_ADD` | Добавляет или изменяет событие |304| `KQ_EV_DELETE` | Удаляет событие из очереди |305| `KQ_EV_ENABLE` | Позволяет control() вернуть событие |306| `KQ_EV_DISABLE` | Отключает событие |307| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания |308| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события |309| `KQ_EV_SYSFLAGS` | внутреннее событие |310| `KQ_EV_FLAG1` | внутреннее событие |311| `KQ_EV_EOF` | Условие EOF для конкретного фильтра |312| `KQ_EV_ERROR` | См. возвращаемые значения |313314#### `kevent.fflags`315316Флаги, специфичные для фильтра317318`KQ_FILTER_READ` и `KQ_FILTER_WRITE` флаги фильтра:319320| Константа | Значение |321| --- | --- |322| `KQ_NOTE_LOWAT` | нижняя граница буфера сокета |323324`KQ_FILTER_VNODE` флаги фильтра:325326| Константа | Значение |327| --- | --- |328| `KQ_NOTE_DELETE` | была вызвана *unlink()* |329| `KQ_NOTE_WRITE` | произошла запись |330| `KQ_NOTE_EXTEND` | файл был расширен |331| `KQ_NOTE_ATTRIB` | атрибут был изменён |332| `KQ_NOTE_LINK` | количество ссылок изменилось |333| `KQ_NOTE_RENAME` | файл был переименован |334| `KQ_NOTE_REVOKE` | доступ к файлу был отозван |335336`KQ_FILTER_PROC` флаги фильтра:337338| Константа | Значение |339| --- | --- |340| `KQ_NOTE_EXIT` | процесс завершился |341| `KQ_NOTE_FORK` | процесс вызвал *fork()* |342| `KQ_NOTE_EXEC` | процесс запустил новый процесс |343| `KQ_NOTE_PCTRLMASK` | внутренний флаг фильтра |344| `KQ_NOTE_PDATAMASK` | внутренний флаг фильтра |345| `KQ_NOTE_TRACK` | отслеживать процесс через *fork()* |346| `KQ_NOTE_CHILD` | возвращено в дочернем процессе для *NOTE\_TRACK* |347| `KQ_NOTE_TRACKERR` | не удаётся подключиться к дочернему процессу |348349`KQ_FILTER_NETDEV` флаги фильтра (недоступно в Mac OS X):350351| Константа | Значение |352| --- | --- |353| `KQ_NOTE_LINKUP` | соединение активно |354| `KQ_NOTE_LINKDOWN` | соединение разорвано |355| `KQ_NOTE_LINKINV` | состояние соединения недействительно |356357#### `kevent.data`358359Данные, специфичные для фильтра.360361#### `kevent.udata`362363Значение, определённое пользователем.364