Как получить полное пространство имен с помощью Python code.interact?

Как я могу получить доступ ко всему пространству имен, включая нелокальные имена, когда, например, выполняю code.interact в Python (v. 3.6)?

Часто предлагается следующее решение или какой-либо эквивалент:

code.interact(local={**globals(), **locals()})

Это, однако, не предоставляет нелокальные имена (имена внешней функции, видимой из внутренней функции). На самом деле, даже встроенная функция dir () выглядит странно в этом отношении:

def f():
    x = 1
    def g():
        print('g:', dir())
        # print(x)
    g()
    print('f:', dir())

Имя x невидимо для dir () в приведенном выше коде, но видно, если строка print (x) не закомментирована. Забавно, как семантика dir () должна зависеть от того, что происходит после него?! (Это оптимизация или ошибка или как?) Так есть ли способ получить все нелокальные имена, не обращаясь к ним первым?

Я бы предпочел не писать свою собственную функцию (используя inspect или что-то еще).

0 ответов

Другие вопросы по тегам