首页 > 解决方案 > 如何在调用堆栈中询问更高的变量(不传递参数)?

问题描述

在 Python 3.6.x 及更高版本中,是否有一种方法可以引用(询问)包含在调用堆栈中的函数中的局部变量,该局部变量在调用堆栈中高于需要执行询问的函数 - 而不将变量作为参数传递?

例如:

def lowest_leaf():
    #Is there a way to access a_value and/or b_value 
        #from lowest_leaf() WITHOUT passing them as arguments into 
        #this function?
    #HERE: print(a_value)
    #HERE: print(b_value)
    return(0)


def middle_leaf(a_value):
    print(a_value)
    b_value = a_value * 2
    lowest_leaf()
    return(0)


def root_leaf():
    a_value = 10
    middle_leaf(a_value)
    return(0)

if '__name__' == '__main__':
    root_leaf()

非常非常感谢您的帮助!

标签: pythonpython-3.x

解决方案


我要强调的是,这通常是一件狡猾的事情,因为它破坏了封装,如评论中所述。除非您有充分的理由这样做(并且如果您需要考虑是否这样做,则不这样做),我建议您重新设计您的应用程序。

尽管如此,Python 是围绕我们都是成年人的想法而构建的,因此你可以做你想做的事情inspect

import inspect

def lowest_leaf():
    middle_leaf_frame = inspect.currentframe().f_back
    print(middle_leaf_frame.f_locals)
    root_leaf_frame = middle_leaf_frame.f_back
    print(root_leaf_frame.f_locals)

def middle_leaf(a_value):
    b_value = a_value * 2
    lowest_leaf()

def root_leaf():
    a_value = 10
    middle_leaf(a_value)

root_leaf()

输出:

{'a_value': 10, 'b_value': 20}
{'a_value': 10}

推荐阅读