Доступ к пространству имен вызывающего модуля - PullRequest
6 голосов
/ 23 марта 2012

Я знаю, что этого обычно не следует делать, и я знаю причины этого. Тем не менее, я делаю функцию отладки внутри класса, которая должна отображать некоторую информацию о модуле, который ее вызвал.

Мне нужно знать, как подняться на один уровень в пространстве имен, чтобы найти переменную, которая всегда должна существовать в программе, которая одновременно вызывает этот модуль и нуждается в этой функции.

Я знаю, что главное пространство имен можно получить с помощью:

    import __main__

Но я предполагаю, что это включает в себя все, начиная с самого первого запущенного модуля, и я просто хочу тот, который назвал этот.

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Попробуйте использовать стек интерпретатора Python

1 голос
/ 07 августа 2018

warvariuc уже ответил, но пример тоже может быть отличным.Если вы хотите знать о предыдущем пространстве имен, вы можете использовать inspect:

import inspect
from pprint import pprint


def foo():
    frame = inspect.currentframe()
    previous_namespace = frame.f_back.f_locals
    pprint(previous_namespace)


def bar():
    def inner_function():
        pass
    a = "foo"
    b = 5
    c = {}
    d = []

    foo()

Тогда вы можете сделать:

>>> bar()

{'a': 'foo',
 'b': 5,
 'c': {},
 'd': [],
 'inner_function': <function bar.<locals>.inner_function at 0x0000000002D6D378>}
1 голос
/ 23 марта 2012

Объект, который вызывает «объект отладки», должен просто передать self в качестве параметра.Тогда «объект отладки» будет иметь доступ ко всем атрибутам вызывающих.Например:

class Custom(object):
    def __init__(self):
        self.detail = 77

    def call_bug(self, name):
        name.bug(self)

class Debugger(object):
    def bug(self, caller):
        print caller.__dict__

custom = Custom()
debugger = Debugger()
custom.call_bug(debugger)

output:
{'detail': 77}

Этот принцип прекрасно работает для разных файлов.

...