#python
#python
Вопрос:
Я хочу знать, импортировано ли несколько модулей, и попробовал следующие 3 способа. Но я обнаружил, что их результат отличается. Интересно, почему прямое использование dir()
in all(...)
приводит к неверному результату?
import re, os
# Approach 1
all(k in dir() for k in ('re', 'os')) # False
# Approach 2
're' in dir() and 'os' in dir() # True
# Approach 3
list = dir()
all(k in list for k in ['re', 'os']) # True
Комментарии:
1.
dir()
возвращает вам список локальных имен в текущей области . Генератор вводит новую область, гдеre
иos
не являются локальными именами. Поэтому вы их не видите..2. Еще одно замечание — в следующий раз не используйте bulit-in
list
в качестве переменной.
Ответ №1:
dir()
без аргументов зависит от текущей области:
Без аргументов верните список имен в текущей локальной области.
Внутри выражения генератора область действия изменяется:
>>> list(dir() for _ in ("re", "os"))
[['.0', '_'], ['.0', '_']]
Это также верно для понимания list , set и dict:
помимо повторяющегося выражения в крайнем левом
for
предложении, понимание выполняется в отдельной неявно вложенной области. Это гарантирует, что имена, назначенные в целевом списке, не «просачиваются» во охватывающую область.