#python #python-3.x #if-statement #environment-variables #global-variables
Вопрос:
У меня есть следующий код, в котором я пытаюсь избежать загрузки symspell.pkl
файла, как только он уже загружен в память:
from symspellpy import SymSpell
if 'sym_spell' in globals():
print('sym_spell is already loaded!')
sym_spell = global()['sym_spell']
esle:
print('loading sym_spell...')
sym_spell = SymSpell(max_dictionary_edit_distance=5, prefix_length=7)
sym_spell.load_pickle('symspell.pkl')
но, похоже, python всегда выполняет else
оператор, даже если if
он есть True
.
Ниже приведены мои вопросы:
- Может ли кто-нибудь объяснить, почему Python всегда выполняет
else
оператор здесь? - Является ли то, что я пробовал, правильным способом пропустить загрузку файла, если он уже загружен в память в Python? Если нет, то есть ли лучший способ?
Я использую python3.8.2.
Заранее спасибо.
Ответ №1:
Я не понял, что вы пытаетесь сделать, но это if
утверждение всегда ложно, потому что в глобалах нет «sym_spell». Я думаю, что вы пытаетесь проверить «SymSpell», а не «sym_spell».
Редактировать :
Является ли то, что я пробовал, правильным способом пропустить загрузку файла, если он уже загружен в память в Python? Если нет, то есть ли лучший способ?
Нет, я не думаю, что есть способ сделать то, о чем вы точно просите. Но если ваш файл очень огромен и вы не хотите загружать одни и те же данные снова, снова и снова. Тогда это лучшее решение для вас. Вы можете заглянуть в лабораторию Jupyter или в записную книжку Jupyter.
Лаборатория Юпитера :
JupyterLab: Интерфейс ноутбука следующего поколения Jupyter JupyterLab-это интерактивная веб-среда разработки для ноутбуков, кода и данных Jupyter. JupyterLab отличается гибкостью: настраивает и организует пользовательский интерфейс для поддержки широкого спектра рабочих процессов в области обработки данных, научных вычислений и машинного обучения. JupyterLab является расширяемым и модульным: пишите плагины, которые добавляют новые компоненты и интегрируются с существующими.
Записная книжка Юпитера :
Записная книжка Jupyter-это веб-приложение с открытым исходным кодом, которое позволяет создавать и обмениваться документами, содержащими живой код, уравнения, визуализации и повествовательный текст. Использование включает в себя: очистку и преобразование данных, численное моделирование, статистическое моделирование, визуализацию данных, машинное обучение и многое другое.
Здесь вы можете загрузить свои данные один раз, и без импорта этих данных вы можете использовать их несколько раз. Вы можете протестировать его прямо сейчас из своего браузера, чтобы посмотреть, как оно работает. Оттуда на официальном сайте. Я думаю, что это было бы очень полезно для вас.
Комментарии:
1. Спасибо за ответ. Да, я действительно проверяю
sym_spell
, и, как я уже сказал, этоif
утверждение верно.2. Извините, но я имею в виду, что это не ответ на мой вопрос.
3. Я не совсем понял твой вопрос. Пожалуйста, приведите пример, если это возможно!
4. Не кажется ли вам, что python всегда выполняет оператор else, даже если оператор if истинен , ваш вопрос? И разве мое решение не решило вашу проблему?
5. ОК. В самый первый раз, когда я запускаю свой скрипт,
sym_spell in globals()
= = False, и он выполняетelse
инструкцию. Когда я запускаю во второй разsym_spell in globals()
== True, и он должен выполнитьelse
инструкцию.
Ответ №2:
Я публикую свое исправление на всякий случай, если это может быть полезно.
После многих попыток я заставил его работать с помощью builtins
модуля (вместо globals()
) и try/except
оператора, как показано ниже:
import builtins
from symspellpy import SymSpell
try:
if builtins.sym_spell:
print('sym_spell is already loaded!')
sym_spell = builtins.sym_spell
except:
print('sym_spell is not yet loaded! loading sym_spell...')
sym_spell = SymSpell(max_dictionary_edit_distance=5, prefix_length=7)
sym_spell.load_pickle('symspell.pkl')
builtins.sym_spell = sym_spell