@@ -51,7 +51,7 @@ const bool anyks::Stemmer::check(const wstring & word) const noexcept {
5151 // Если слово передано
5252 if (!word.empty ()){
5353 // Если это не первый или последний дефис
54- result = ((word[ 0 ] != L' -' ) && (word[word. length () - 1 ] != L' -' ));
54+ result = ((word. front () != L' -' ) && (word. back () != L' -' ));
5555 // Если слово прошло проверку
5656 if (result) result = !this ->alphabet ->isANumber (word);
5757 }
@@ -79,16 +79,22 @@ void anyks::Stemmer::setVMethod(variants_t fn) noexcept {
7979 * @param script python скрипт для установки
8080 */
8181void anyks::Stemmer::setLScript (const string & script) noexcept {
82+ // Если работа идет не изнутри Python
83+ #ifndef NOPYTHON
8284 // Если скрипт передан, устанавливаем его
8385 if (!script.empty () && (this ->script != nullptr )) this ->lemmaScript = this ->script ->add (script, 2 );
86+ #endif
8487}
8588/* *
8689 * setVScript Метод установки скрипта подбора вариантов
8790 * @param script python скрипт для установки
8891 */
8992void anyks::Stemmer::setVScript (const string & script) noexcept {
93+ // Если работа идет не изнутри Python
94+ #ifndef NOPYTHON
9095 // Если скрипт передан, устанавливаем его
9196 if (!script.empty () && (this ->script != nullptr )) this ->variantsScript = this ->script ->add (script, 2 );
97+ #endif
9298}
9399/* *
94100 * setTokenizer Метод установки токенизатора
@@ -99,6 +105,8 @@ void anyks::Stemmer::setTokenizer(const tokenizer_t * tokenizer){
99105 if (tokenizer != nullptr ){
100106 // Устанавливаем модуль генератора
101107 this ->tokenizer = tokenizer;
108+ // Если работа идет не изнутри Python
109+ #ifndef NOPYTHON
102110 // Если внешняя функция не установлена
103111 if ((this ->lemmaFn == nullptr ) && (this ->variantsFn == nullptr ) && (this ->script == nullptr )){
104112 try {
@@ -110,6 +118,7 @@ void anyks::Stemmer::setTokenizer(const tokenizer_t * tokenizer){
110118 exit (EXIT_FAILURE);
111119 }
112120 }
121+ #endif
113122 }
114123}
115124/* *
@@ -139,26 +148,29 @@ const wstring anyks::Stemmer::lemma(const wstring & word, const wstring & code)
139148 wstring result = L" " ;
140149 // Если слово передано и скрипт загружен
141150 if (!word.empty () && !code.empty () && ((this ->lemmaFn != nullptr ) || (this ->lemmaScript > 0 )) && this ->check (word)){
142- // Блокируем остальные потоки до завершения работы скрипта
143- this -> locker . lock () ;
151+ // Код языка к которому принадлежит слово
152+ wstring lang = code ;
144153 // Если это русский язык, проверяем на латиницу
145- if ((code.compare (L" en" ) != 0 ) && this ->alphabet ->isLatian (word))
146- // Устанавливаем код языка, по умолчанию
147- const_cast <wstring *> (&code)->assign (L" en" );
154+ if ((lang.compare (L" en" ) != 0 ) && this ->alphabet ->isLatian (word)) lang = L" en" ;
148155 // Если внешняя функция установлена
149- if (this ->lemmaFn != nullptr ) result = this ->lemmaFn (word, code);
156+ if (this ->lemmaFn != nullptr ) result = this ->lemmaFn (word, lang);
157+ // Если работа идет не изнутри Python
158+ #ifndef NOPYTHON
150159 // Если скрипт Python установлен
151160 else if (this ->script != nullptr ){
161+ // Блокируем остальные потоки до завершения работы скрипта
162+ this ->locker .lock ();
152163 // Выполняем скрипт для получения вариантов
153164 result = this ->script ->run (
154165 this ->lemmaScript , {
155166 this ->alphabet ->convert (word),
156- this ->alphabet ->convert (code )
167+ this ->alphabet ->convert (lang )
157168 }
158169 );
170+ // Разблокируем остальные потоки
171+ this ->locker .unlock ();
159172 }
160- // Разблокируем остальные потоки
161- this ->locker .unlock ();
173+ #endif
162174 }
163175 // Выводим результат
164176 return result;
@@ -174,28 +186,31 @@ const list <wstring> anyks::Stemmer::variants(const wstring & word, const wstrin
174186 list <wstring> result;
175187 // Если слово передано и скрипт загружен
176188 if (!word.empty () && !code.empty () && ((this ->variantsFn != nullptr ) || (this ->variantsScript > 0 )) && this ->check (word)){
177- // Блокируем остальные потоки до завершения работы скрипта
178- this -> locker . lock () ;
189+ // Код языка к которому принадлежит слово
190+ wstring lang = code ;
179191 // Если это русский язык, проверяем на латиницу
180- if ((code.compare (L" en" ) != 0 ) && this ->alphabet ->isLatian (word))
181- // Устанавливаем код языка, по умолчанию
182- const_cast <wstring *> (&code)->assign (L" en" );
192+ if ((lang.compare (L" en" ) != 0 ) && this ->alphabet ->isLatian (word)) lang = L" en" ;
183193 // Если функция подборки вариантов установлена
184- if (this ->variantsFn != nullptr ) result = this ->variantsFn (word, code);
194+ if (this ->variantsFn != nullptr ) result = this ->variantsFn (word, lang);
195+ // Если работа идет не изнутри Python
196+ #ifndef NOPYTHON
185197 // Если функция подборки вариантов не передана
186198 else if (this ->script != nullptr ) {
199+ // Блокируем остальные потоки до завершения работы скрипта
200+ this ->locker .lock ();
187201 // Выполняем скрипт для получения вариантов
188202 const wstring & res = this ->script ->run (
189203 this ->variantsScript , {
190204 this ->alphabet ->convert (word),
191- this ->alphabet ->convert (code )
205+ this ->alphabet ->convert (lang )
192206 }
193207 );
208+ // Разблокируем остальные потоки
209+ this ->locker .unlock ();
194210 // Если результат получен
195211 if (!res.empty ()) this ->alphabet ->split (res, L" |" , result);
196212 }
197- // Разблокируем остальные потоки
198- this ->locker .unlock ();
213+ #endif
199214 // Если результат получен
200215 if (!result.empty ()){
201216 // Выполняем сортировку
@@ -238,6 +253,16 @@ anyks::Stemmer::Stemmer(const alphabet_t * alphabet, const tokenizer_t * tokeniz
238253 * ~Stemmer Деструктор
239254 */
240255anyks::Stemmer::~Stemmer () noexcept {
256+ // Если работа идет не изнутри Python
257+ #ifndef NOPYTHON
241258 // Если объект создан, удаляем его
242259 if (this ->script != nullptr ) delete this ->script ;
260+ #endif
261+ /* *
262+ * Так и не понял этот баг
263+ * Деструктор отрабатывает но из-за установленной функции lemmaFn поток блокируется намертво
264+ * Игры с py::gil_scoped_release ничего не дали, блокировки в любом случае есть
265+ * По этому просто выходим из приложения, по завершению работы деструктора
266+ */
267+ exit (0 );
243268}
0 commit comments