Почему прямое использование dir() во всех (…) всегда возвращает False в python?

#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 предложении, понимание выполняется в отдельной неявно вложенной области. Это гарантирует, что имена, назначенные в целевом списке, не «просачиваются» во охватывающую область.