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

nntplib.md

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

1> **Источник:** https://python-all.ru/3.8/library/nntplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`nntplib`](https://python-all.ru/3.8/library/nntplib.html#module-nntplib) – клиент протокола NNTP89**Исходный код:** [Lib/nntplib.py](https://python-all.ru/src/3.8/Lib/nntplib.py)1011---1213Этот модуль определяет класс [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP), реализующий клиентскую часть протокола передачи новостей (Network News Transfer Protocol). Его можно использовать для создания программ чтения новостей, публикации сообщений или автоматической обработки новостей. Он совместим с [**RFC 3977**](https://python-all.ru/3.8/library/nntplib.html), а также с более старыми [**RFC 977**](https://python-all.ru/3.8/library/nntplib.html) и [**RFC 2980**](https://python-all.ru/3.8/library/nntplib.html).1415Вот два небольших примера использования. Чтобы вывести статистику по группе новостей и напечатать темы последних 10 статей:1617```python18>>> s = nntplib.NNTP('news.gmane.io')19>>> resp, count, first, last, name = s.group('gmane.comp.python.committers')20>>> print('Group', name, 'has', count, 'articles, range', first, 'to', last)21Group gmane.comp.python.committers has 1096 articles, range 1 to 109622>>> resp, overviews = s.over((last - 9, last))23>>> for id, over in overviews:24...     print(id, nntplib.decode_header(over['subject']))25...261087 Re: Commit privileges for Łukasz Langa271088 Re: 3.2 alpha 2 freeze281089 Re: 3.2 alpha 2 freeze291090 Re: Commit privileges for Łukasz Langa301091 Re: Commit privileges for Łukasz Langa311092 Updated ssh key321093 Re: Updated ssh key331094 Re: Updated ssh key341095 Hello fellow committers!351096 Re: Hello fellow committers!36>>> s.quit()37'205 Bye!'38```3940Чтобы опубликовать статью из двоичного файла (предполагается, что статья содержит корректные заголовки и у вас есть права на публикацию в данной группе новостей):4142```python43>>> s = nntplib.NNTP('news.gmane.io')44>>> f = open('article.txt', 'rb')45>>> s.post(f)46'240 Article posted successfully.'47>>> s.quit()48'205 Bye!'49```5051Сам модуль определяет следующие классы:5253#### `class nntplib.NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False[, timeout])`5455Возвращает новый объект [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP), представляющий соединение с NNTP-сервером, работающим на хосте *host*, прослушивающем порт *port*. Для сокетного соединения можно указать необязательный *timeout*. Если указаны необязательные *user* и *password*, или если подходящие учётные данные находятся в `/.netrc` и необязательный флаг *usenetrc* имеет значение true, для идентификации и аутентификации пользователя на сервере используются команды `AUTHINFO USER` и `AUTHINFO PASS`. Если необязательный флаг *readermode* имеет значение true, то перед выполнением аутентификации отправляется команда `mode reader`. Режим чтения (reader mode) иногда необходим, если вы подключаетесь к NNTP-серверу на локальной машине и собираетесь вызывать специфичные для чтения команды, например `group`. Если вы получаете неожиданные [`NNTPPermanentError`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTPPermanentError), возможно, потребуется установить *readermode*. Класс [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP) поддерживает оператор [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) для безусловного перехвата исключений [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) и закрытия NNTP-соединения по завершении, например:5657```python58>>> from nntplib import NNTP59>>> with NNTP('news.gmane.io') as n:60...     n.group('gmane.comp.python.committers')61... 62('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')63>>>64```6566Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `nntplib.connect` с аргументами `self`, `host`, `port`.6768Все команды вызывают [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `nntplib.putline` с аргументами `self` и `line`, где `line` – это байты, которые будут отправлены удалённому хосту.6970Изменено в версии 3.2: *usenetrc* теперь по умолчанию равен `False`.7172Изменено в версии 3.3: Добавлена поддержка оператора [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with).7374#### `class nntplib.NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False[, timeout])`7576Возвращает новый объект [`NNTP_SSL`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP_SSL), представляющий зашифрованное соединение с NNTP-сервером, работающим на хосте *host*, прослушивающем порт *port*. Объекты [`NNTP_SSL`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP_SSL) имеют те же методы, что и объекты [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP). Если *port* опущен, используется порт 563 (NNTPS). *ssl\_context* также необязателен и является объектом [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext). Пожалуйста, прочитайте [Соображения безопасности](https://python-all.ru/3.8/library/ssl.html#ssl-security) для ознакомления с лучшими практиками. Все остальные параметры ведут себя так же, как для [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP).7778Обратите внимание, что SSL на порту 563 не рекомендуется согласно [**RFC 4642**](https://python-all.ru/3.8/library/nntplib.html), вместо него следует использовать STARTTLS, как описано ниже. Однако некоторые серверы поддерживают только первый вариант.7980Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `nntplib.connect` с аргументами `self`, `host`, `port`.8182Все команды вызывают [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `nntplib.putline` с аргументами `self` и `line`, где `line` – это байты, которые будут отправлены удалённому хосту.8384Новое в версии 3.2.8586Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.8/library/ssl.html#ssl.HAS_SNI)).8788#### `exception nntplib.NNTPError`8990Производный от стандартного исключения [`Exception`](https://python-all.ru/3.8/library/exceptions.html#Exception), это базовый класс для всех исключений, возбуждаемых модулем [`nntplib`](https://python-all.ru/3.8/library/nntplib.html#module-nntplib). Экземпляры этого класса имеют следующий атрибут:9192#### `response`9394Ответ сервера, если доступен, в виде объекта [`str`](https://python-all.ru/3.8/library/stdtypes.html#str).9596#### `exception nntplib.NNTPReplyError`9798Исключение, возникающее при получении неожиданного ответа от сервера.99100#### `exception nntplib.NNTPTemporaryError`101102Исключение возбуждается, когда получен код ответа в диапазоне 400–499.103104#### `exception nntplib.NNTPPermanentError`105106Исключение возбуждается, когда получен код ответа в диапазоне 500–599.107108#### `exception nntplib.NNTPProtocolError`109110Исключение возбуждается, когда от сервера получен ответ, который не начинается с цифры в диапазоне 1–5.111112#### `exception nntplib.NNTPDataError`113114Исключение возбуждается при наличии ошибки в данных ответа.115116## Объекты NNTP117118В подключённом состоянии объекты [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP) и [`NNTP_SSL`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP_SSL) поддерживают следующие методы и атрибуты.119120### Атрибуты121122#### `NNTP.nntp_version`123124Целое число, представляющее версию протокола NNTP, поддерживаемую сервером. На практике должно быть равно `2` для серверов, заявляющих о соответствии [**RFC 3977**](https://python-all.ru/3.8/library/nntplib.html), и `1` для остальных.125126Новое в версии 3.2.127128#### `NNTP.nntp_implementation`129130Строка с названием и версией программного обеспечения NNTP-сервера или [`None`](https://python-all.ru/3.8/library/constants.html#None), если сервер не предоставил эту информацию.131132Новое в версии 3.2.133134### Методы135136*Ответ*, возвращаемый в качестве первого элемента кортежа результатов почти всех методов, – это ответ сервера: строка, начинающаяся с трёхзначного кода. Если ответ сервера указывает на ошибку, метод возбуждает одно из перечисленных выше исключений.137138Многие из следующих методов принимают необязательный аргумент, передаваемый только по ключу, *file*. Когда аргумент *file* указан, он должен быть либо [файловый объект](https://python-all.ru/3.8/glossary.html#term-file-object), открытым для бинарной записи, либо именем файла на диске для записи. В этом случае метод будет записывать все данные, возвращаемые сервером (за исключением строки ответа и завершающей точки), в файл; любой список строк, кортежей или объектов, который метод обычно возвращает, будет пуст.139140Изменено в версии 3.2: Многие из следующих методов были переработаны и исправлены, что делает их несовместимыми с их аналогами из версии 3.1.141142#### `NNTP.quit()`143144Отправляет команду `QUIT` и закрывает соединение. После вызова этого метода не следует вызывать другие методы объекта NNTP.145146#### `NNTP.getwelcome()`147148Возвращает приветственное сообщение, отправленное сервером в ответ на начальное подключение. (Это сообщение иногда содержит отказ от ответственности или справочную информацию, которая может быть полезна пользователю.)149150#### `NNTP.getcapabilities()`151152Возвращает [**RFC 3977**](https://python-all.ru/3.8/library/nntplib.html) возможности, объявленные сервером, в виде экземпляра [`dict`](https://python-all.ru/3.8/library/stdtypes.html#dict), отображающего имена возможностей в (возможно пустые) списки значений. На устаревших серверах, которые не понимают команду `CAPABILITIES`, вместо этого возвращается пустой словарь.153154```python155>>> s = NNTP('news.gmane.io')156>>> 'POST' in s.getcapabilities()157True158```159160Новое в версии 3.2.161162#### `NNTP.login(user=None, password=None, usenetrc=True)`163164Отправляет команды `AUTHINFO` с именем пользователя и паролем. Если *user* и *password* равны `None`, а *usenetrc* истинно, то по возможности будут использованы учётные данные из `~/.netrc`.165166Если задержка не задана намеренно, вход обычно выполняется во время инициализации объекта [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP), и отдельный вызов этой функции не требуется. Чтобы принудительно отложить аутентификацию, при создании объекта не следует задавать *user* или *password*, а *usenetrc* должно быть установлено в False.167168Новое в версии 3.2.169170#### `NNTP.starttls(context=None)`171172Отправляет команду `STARTTLS`. Это включает шифрование на NNTP-соединении. Аргумент *context* является необязательным и должен быть объектом [`ssl.SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext). Рекомендуется ознакомиться с [рекомендациями по безопасности](https://python-all.ru/3.8/library/ssl.html#ssl-security) для соблюдения передовых практик.173174Обратите внимание, что это не может быть выполнено после передачи данных аутентификации, и аутентификация по умолчанию происходит, если это возможно, во время инициализации объекта [`NNTP`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP). Информацию о подавлении этого поведения см. в [`NNTP.login()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.login).175176Новое в версии 3.2.177178Изменено в версии 3.4: Теперь метод поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.8/library/ssl.html#ssl.HAS_SNI)).179180#### `NNTP.newgroups(date, *, file=None)`181182Отправляет команду `NEWGROUPS`. Аргумент *date* должен быть объектом [`datetime.date`](https://python-all.ru/3.8/library/datetime.html#datetime.date) или [`datetime.datetime`](https://python-all.ru/3.8/library/datetime.html#datetime.datetime). Возвращает пару `(response, groups)`, где *groups* – это список, представляющий группы, появившиеся после указанной даты *date*. Однако если указан *file*, то *groups* будет пуст.183184```python185>>> from datetime import date, timedelta186>>> resp, groups = s.newgroups(date.today() - timedelta(days=3))187>>> len(groups) 18885189>>> groups[0] 190GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m')191```192193#### `NNTP.newnews(group, date, *, file=None)`194195Отправляет команду `NEWNEWS`. Здесь *group* – это имя группы или `'*'`, а *date* имеет то же значение, что и для [`newgroups()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.newgroups). Возвращает пару `(response, articles)`, где *articles* – это список идентификаторов сообщений.196197Эта команда часто отключается администраторами NNTP-серверов.198199#### `NNTP.list(group_pattern=None, *, file=None)`200201Отправляет команду `LIST` или `LIST ACTIVE`. Возвращает пару `(response, list)`, где *list* – это список кортежей, представляющих все группы, доступные на этом NNTP-сервере, опционально соответствующие строке шаблона *group\_pattern*. Каждый кортеж имеет вид `(group, last, first, flag)`, где *group* – имя группы, *last* и *first* – последний и первый номера статей, а *flag* обычно принимает одно из следующих значений:202203- `y`: разрешены локальные сообщения и статьи от внешних серверов.204- `m`: группа модерируется, и все сообщения должны быть одобрены.205- `n`: локальные сообщения запрещены, допускаются только статьи от внешних серверов.206- `j`: статьи от внешних серверов вместо этого помещаются в группу junk.207- `x`: локальные сообщения отсутствуют, а статьи от внешних серверов игнорируются.208- `=foo.bar`: статьи помещаются в группу `foo.bar` вместо этого.209210Если *flag* имеет другое значение, статус группы новостей следует считать неизвестным.211212Эта команда может возвращать очень большие результаты, особенно если *group\_pattern* не указан. Результаты лучше кэшировать в автономном режиме, если только нет реальной необходимости их обновлять.213214Изменено в версии 3.2: был добавлен *group\_pattern*.215216#### `NNTP.descriptions(grouppattern)`217218Отправляет команду `LIST NEWSGROUPS`, где *grouppattern* – это строка wildmat, как указано в [**RFC 3977**](https://python-all.ru/3.8/library/nntplib.html) (она, по сути, аналогична подстановочным строкам оболочки DOS или UNIX). Возвращает пару `(response, descriptions)`, где *descriptions* – это словарь, отображающий имена групп на текстовые описания.219220```python221>>> resp, descs = s.descriptions('gmane.comp.python.*')222>>> len(descs) 223295224>>> descs.popitem() 225('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')226```227228#### `NNTP.description(group)`229230Получает описание для одной группы *group*. Если совпадает несколько групп (если ‘group’ – это строка шаблона wildmat), возвращается первое совпадение. Если ни одна группа не совпадает, возвращается пустая строка.231232Этот метод скрывает код ответа от сервера. Если код ответа необходим, используйте [`descriptions()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.descriptions).233234#### `NNTP.group(name)`235236Отправляет команду `GROUP`, где *name* – это имя группы. Группа выбирается в качестве текущей группы, если она существует. Возвращает кортеж `(response, count, first, last, name)`, где *count* – это (предположительное) количество статей в группе, *first* – номер первой статьи в группе, *last* – номер последней статьи в группе, а *name* – это имя группы.237238#### `NNTP.over(message_spec, *, file=None)`239240Отправляет команду `OVER` или команду `XOVER` на устаревших серверах. *message\_spec* может быть либо строкой, представляющей идентификатор сообщения, либо кортежем `(first, last)` чисел, указывающим диапазон статей в текущей группе, либо кортежем `(first, None)`, указывающим диапазон статей, начиная с *first* до последней статьи в текущей группе, либо [`None`](https://python-all.ru/3.8/library/constants.html#None) для выбора текущей статьи в текущей группе.241242Возвращает пару `(response, overviews)`. *overviews* – это список кортежей `(article_number, overview)`, по одному для каждой статьи, выбранной *message\_spec*. Каждый *overview* – это словарь с таким же количеством элементов, но это количество зависит от сервера. Эти элементы являются либо заголовками сообщения (тогда ключ – это имя заголовка в нижнем регистре), либо элементами метаданных (тогда ключ – это имя метаданных с префиксом `":"`). Следующие элементы гарантированно присутствуют по спецификации NNTP:243244- заголовки `subject`, `from`, `date`, `message-id` и `references`245- метаданные `:bytes`: количество байтов в полном сыром сообщении (включая заголовки и тело)246- метаданные `:lines`: количество строк в теле статьи247248Значением каждого элемента является либо строка, либо [`None`](https://python-all.ru/3.8/library/constants.html#None), если он отсутствует.249250Рекомендуется использовать функцию [`decode_header()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.decode_header) для значений заголовков, если они могут содержать символы не из ASCII:251252```python253>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')254>>> resp, overviews = s.over((last, last))255>>> art_num, over = overviews[0]256>>> art_num257117216258>>> list(over.keys())259['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']260>>> over['from']261'=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>'262>>> nntplib.decode_header(over['from'])263'"Martin v. Löwis" <martin@v.loewis.de>'264```265266Новое в версии 3.2.267268#### `NNTP.help(*, file=None)`269270Отправляет команду `HELP`. Возвращает пару `(response, list)`, где *list* – это список строк справки.271272#### `NNTP.stat(message_spec=None)`273274Отправляет команду `STAT`, где *message\_spec* – это либо идентификатор сообщения (заключённый в `'<'` и `'>'`), либо номер статьи в текущей группе. Если *message\_spec* опущен или равен [`None`](https://python-all.ru/3.8/library/constants.html#None), рассматривается текущая статья в текущей группе. Возвращает тройку `(response, number, id)`, где *number* – это номер статьи, а *id* – идентификатор сообщения.275276```python277>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')278>>> resp, number, message_id = s.stat(first)279>>> number, message_id280(9099, '<20030112190404.GE29873@epoch.metaslash.com>')281```282283#### `NNTP.next()`284285Отправляет команду `NEXT`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.stat).286287#### `NNTP.last()`288289Отправляет команду `LAST`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.stat).290291#### `NNTP.article(message_spec=None, *, file=None)`292293Отправляет команду `ARTICLE`, где *message\_spec* имеет то же значение, что и для [`stat()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.stat). Возвращает кортеж `(response, info)`, где *info* – это [`namedtuple`](https://python-all.ru/3.8/library/collections.html#collections.namedtuple) с тремя атрибутами: *number*, *message\_id* и *lines* (в этом порядке). *number* – номер статьи в группе (или 0, если информация недоступна), *message\_id* – идентификатор сообщения в виде строки, а *lines* – список строк (без завершающих символов новой строки), составляющих сырое сообщение, включая заголовки и тело.294295```python296>>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>')297>>> info.number2980299>>> info.message_id300'<20030112190404.GE29873@epoch.metaslash.com>'301>>> len(info.lines)30265303>>> info.lines[0]304b'Path: main.gmane.org!not-for-mail'305>>> info.lines[1]306b'From: Neal Norwitz <neal@metaslash.com>'307>>> info.lines[-3:]308[b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal']309```310311#### `NNTP.head(message_spec=None, *, file=None)`312313То же, что и [`article()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `HEAD`. Возвращаемые *строки* (или записанные в *file*) будут содержать только заголовки сообщения, а не тело.314315#### `NNTP.body(message_spec=None, *, file=None)`316317То же, что и [`article()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `BODY`. Возвращаемые *строки* (или записанные в *file*) будут содержать только тело сообщения, а не заголовки.318319#### `NNTP.post(data)`320321Post an article using the `POST` command. The *data* argument is either a [file object](https://python-all.ru/3.8/glossary.html#term-file-object) opened for binary reading, or any iterable of bytes objects (representing raw lines of the article to be posted). It should represent a well-formed news article, including the required headers. The [`post()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.post) method automatically escapes lines beginning with `.` and appends the termination line.322323В случае успеха метода возвращается ответ сервера. Если сервер отклоняет отправку, возбуждается исключение [`NNTPReplyError`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTPReplyError).324325#### `NNTP.ihave(message_id, data)`326327Отправляет команду `IHAVE`. *message\_id* – это идентификатор сообщения, отправляемого серверу (заключённый в `'<'` и `'>'`). Параметр *data* и возвращаемое значение такие же, как для [`post()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.post).328329#### `NNTP.date()`330331Возвращает пару `(response, date)`. *date* – это объект [`datetime`](https://python-all.ru/3.8/library/datetime.html#datetime.datetime) , содержащий текущие дату и время сервера.332333#### `NNTP.slave()`334335Отправляет команду `SLAVE`. Возвращает *ответ сервера*.336337#### `NNTP.set_debuglevel(level)`338339Устанавливает уровень отладки экземпляра. Он управляет объёмом выводимых отладочных сообщений. Значение по умолчанию, `0`, не выводит отладочные сообщения. Значение `1` выдаёт умеренное количество отладочной информации, обычно одну строку на запрос или ответ. Значение `2` или больше выводит максимальный объём отладочной информации, регистрируя каждую отправленную и полученную строку соединения (включая текст сообщения).340341Ниже перечислены необязательные расширения NNTP, определённые в [**RFC 2980**](https://python-all.ru/3.8/library/nntplib.html). Некоторые из них заменены более новыми командами в [**RFC 3977**](https://python-all.ru/3.8/library/nntplib.html).342343#### `NNTP.xhdr(hdr, str, *, file=None)`344345Отправляет команду `XHDR`. Аргумент *hdr* – это ключевое слово заголовка, например `'subject'`. Аргумент *str* должен иметь вид `'first-last'`, где *first* и *last* – это номера первой и последней статей для поиска. Возвращает пару `(response, list)`, где *list* – список пар `(id, text)`, где *id* – номер статьи (в виде строки), а *text* – текст запрошенного заголовка для этой статьи. Если указан параметр *file*, то вывод команды `XHDR` сохраняется в файл. Если *file* – строка, метод откроет файл с таким именем, запишет в него и затем закроет. Если *file* – [файловый объект](https://python-all.ru/3.8/glossary.html#term-file-object), то для сохранения строк вывода команды будет вызываться `write()` для него. Если *file* указан, возвращаемый *list* будет пустым списком.346347#### `NNTP.xover(start, end, *, file=None)`348349Отправляет команду `XOVER`. *start* и *end* – это номера статей, определяющие диапазон выбираемых статей. Возвращаемое значение такое же, как для [`over()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.over). Рекомендуется использовать [`over()`](https://python-all.ru/3.8/library/nntplib.html#nntplib.NNTP.over), так как она автоматически применит более новую команду `OVER`, если она доступна.350351#### `NNTP.xpath(id)`352353Возвращает пару `(resp, path)`, где *path* – путь к каталогу статьи с идентификатором сообщения *id*. Чаще всего администраторы NNTP-серверов не включают это расширение.354355Устарело с версии 3.3: Расширение XPATH активно не используется.356357## Вспомогательные функции358359Модуль также определяет следующую вспомогательную функцию:360361#### `nntplib.decode_header(header_str)`362363Декодирует значение заголовка, снимая экранирование любых экранированных символов, не входящих в ASCII. *header\_str* должен быть объектом [`str`](https://python-all.ru/3.8/library/stdtypes.html#str). Возвращается значение без экранирования. Рекомендуется использовать эту функцию для отображения некоторых заголовков в удобочитаемом виде:364365```python366>>> decode_header("Some subject")367'Some subject'368>>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=")369'Débuter en Python'370>>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=")371'Re: problème de matrice'372```373