/Users/kiddo/anaconda/lib/python3.6/site-packages/nltk/corpus/reader/wordlist.py:28: ResourceWarning: незакрытый файл <_io.bufferedreader i = "4">
return concat ([self.open (f) .read () для f в идентификаторах файлов])
Это предупреждение, которое я обнаружил в режиме отладки. Я подумал, что, возможно, вы захотите исправить это до следующего выпуска.
Привет, могу я заняться этим вопросом?
@iliaschalkidis @alvations Как воспроизвести предупреждение в linux?
@ sks4903440 Используя версию 3.2.5, вы можете попробовать запустить следующий скрипт в командной строке:
test.py
import warnings
import nltk
warnings.filterwarnings('error', category=ResourceWarning)
stop_words = nltk.corpus.stopwords.words('english')
$ python test.py
У вас должно получиться:
ResourceWarning: unclosed file <_io.BufferedReader name='/Users/kiddo/nltk_data/corpora/stopwords/english'>
Исправлено в # 1945
Хммм ... Наследование io.BufferedReader
в StreamCorpusReader - интересное решение, но, возможно, закрытие файла должным образом с помощью контекстных менеджеров with
scope могло бы быть лучшим решением.
И я думаю, что у Python3.6 есть некоторые особые требования к файлам, которые отличаются от предыдущих версий. Мы должны прочитать журнал изменений от CPython, чтобы убедиться, что то, что мы делаем, не просто бандаж =)
@alvations Использование with
, несомненно, было бы хорошей идеей. Я бы попытался включить это. Поскольку в CPython сборщик мусора автоматически закрывает файл после нулевого счетчика ссылок, я этого не использовал. Также, чтобы оператор with
работал, нам нужно будет использовать io.BufferedReader
или реализовать методы __enter__
и __exit__
. Как думаете, лучше?
~ Я думаю, что нам не нужно реализовывать методы входа / выхода, поскольку мы не будем наследовать от BufferedReader, а будем использовать контекст для открытия и закрытия, а затем позволим модулю io
обрабатывать gc (сборка мусора ). ~
Это сложно, io.BufferedReader
уже имеет функцию seek()
и когда SeekableUnicodeStreamReader
наследуется от этого, не выполняя никаких супер __init__()
, я не совсем уверен что он берет от BufferedReader.
И на самом деле мы не можем обернуть with
внутри read()
потому что это предотвратит работу функций поиска и распознавания, если мы не взломаем буфер в контексте with
. Хм ...
Есть новости по этому поводу? Python 3.6 по-прежнему жалуется на NLTK 3.3 практически на всех ресурсах:
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1107: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/lexnames'>
for i, line in enumerate(self.open('lexnames')):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.adj'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.adv'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.noun'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.verb'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/adj.exc'>
for line in self.open('%s.exc' % suffix):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/adv.exc'>
for line in self.open('%s.exc' % suffix):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/noun.exc'>
for line in self.open('%s.exc' % suffix):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/verb.exc'>
Предлагаемое исправление: https://github.com/nltk/nltk/pull/2165
Еще один вопрос, который вроде бы решен, может быть, неплохо закрыть выпуск.
Спасибо всем за то, что подняли проблему, и @purificant за исправление!
Самый полезный комментарий
Есть новости по этому поводу? Python 3.6 по-прежнему жалуется на NLTK 3.3 практически на всех ресурсах: