python - 如何在调用堆栈中询问更高的变量(不传递参数)?
问题描述
在 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()
非常非常感谢您的帮助!
解决方案
我要强调的是,这通常是一件狡猾的事情,因为它破坏了封装,如评论中所述。除非您有充分的理由这样做(并且如果您需要考虑是否这样做,则不这样做),我建议您重新设计您的应用程序。
尽管如此,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}
推荐阅读
- listview - 没有列表视图背景颜色的 ProgressView,用于异步加载内容
- r - 用 dbplyr 总结的五位数
- python - 是否可以使用 pyqtgraph 函数在 Jupyter Notebook 上内联绘图?
- python - 使用 mysql.connector 模块获取 MYSQL 表的值
- javascript - 在 Javascript 中使用按钮显示和隐藏元素
- android - Firebase 存储错误:参数无效:“_File”实例
- java - 处理从文件读取的值时的最佳实践
- r - 如何使用 dplyr lag() 平滑变量中的微小变化
- c++ - C6001 关于使用未初始化值的地址。为什么?
- java - Android Java Firebase runTransaction 在类不完全相同时删除值