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)
我最终找到了一种方法来做我想做的事情,而不必增加名称空间,但如果我没有找到方法,这很可能是需要的,所以我选择它作为答案。