Python 调用模块的访问命名空间

Python 调用模块的访问命名空间,python,namespaces,Python,Namespaces,我知道这是人们通常不应该做的事情,我也知道这样做的原因。但是,我正在类中创建一个调试函数,该函数应该显示有关调用它的模块的一些信息 我需要知道如何在名称空间中找到一个变量,该变量应始终存在于调用此模块并需要此函数的程序中 我知道可以通过以下方式获得主名称空间: import __main__ 但我猜这包括了从第一个启动的模块开始的所有内容,我只想要调用这个模块的对象。调用“调试对象”的对象应该只传递self作为参数。然后,“调试对象”将有权访问所有调用者属性。例如: class Cus

我知道这是人们通常不应该做的事情,我也知道这样做的原因。但是,我正在类中创建一个调试函数,该函数应该显示有关调用它的模块的一些信息

我需要知道如何在名称空间中找到一个变量,该变量应始终存在于调用此模块并需要此函数的程序中

我知道可以通过以下方式获得主名称空间:

    import __main__

但我猜这包括了从第一个启动的模块开始的所有内容,我只想要调用这个模块的对象。

调用“调试对象”的对象应该只传递
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}

这一原则在不同的文件中都能很好地发挥作用。

尝试使用已经回答过的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>}
>>bar()
{'a':'foo',
“b”:5,
‘c’:{},
“d”:[…],
“内部函数”:

不完全是我的意思。这是为了从repr工作中获得显示,因此我不能真正修改它调用函数的方式。我只能说函数向外抓取。repr输出需要根据调用它的函数进行更改。呃,那是两个下划线,然后是repr,然后再是两个下划线。这里的格式不正确。它是一个字符串,当它被打印在一个列表中时,用来表示一个对象。@Kelketek-啊,我明白了。我认为您需要使用
inspect
模块。这允许您查看活动对象及其属性,还允许您向后遍历并查找调用方对象/名称空间
inspect.getframeinfo(inspect.currentframe().f_back.f_back)
我最终找到了一种方法来做我想做的事情,而不必增加名称空间,但如果我没有找到方法,这很可能是需要的,所以我选择它作为答案。