python - 返回 Python 中的封闭范围变量
问题描述
给定
我有一个函数,scope
可以在封闭的命名空间内声明,即模块、类或函数。感兴趣的变量直接位于此函数之外。
我如何一般地访问在任何封闭命名空间中声明的变量/参数及其值?
例子
b
用于捕获函数变量 ( ) 和参数 ( )的示例伪代码c
:
a = 1
def func(c=3)
b = 2
def scope():
return ...
return scope()
预期产出
func()
# {'c': 3, 'b': 2}
尝试
我在模块级别取得了一定的成功,例如a = 1
:
# module-level
a = 1
def scope():
return {k: v for k, v in globals().items() if not k.startswith("_")}
scope()
# {'a': 1, ...}
我还可以从方法访问类属性,例如b = 2
:
# class-level
a = 1
class Klass:
b = 2
def scope(self):
obj = self.__class__
return obj.__dict__
Klass().scope()
# {'b': 2, ...}
我只能部分访问封闭函数内的变量和参数:
# function-level
a = 1
def func(c=3):
b = 2
def scope():
obj = func
return obj.__code__.co_varnames
return scope()
func()
# ('c', 'b', 'scope')
虽然__code__.co_varnames
成功地给出了封闭变量(不包括a
),但我也对这些值感兴趣(例如{'c': 3, 'b': 2}
)。
我做了很多未提及的尝试,包括inspect
函数、其他代码对象方法dir()
和对象特殊方法。我的偏好是实现更通用和惯用的代码来检测封闭命名空间中的变量,尽管任何建议都值得赞赏。
我也知道 Python 习语和这个问题的性质。我仍然对它的可能性很感兴趣,我感谢任何愿意超越常规的人。
解决方案
虽然 python 会给你方法来做到这一点,但你真的不想这样做。函数/类/等不应将其内部结构暴露给调用代码,因为这会破坏抽象并使代码变得脆弱。函数应该接受参数并返回输出值,但不应公开内部算法,尤其是变量名。
推荐阅读
- c# - TestCafe 是否与 C# .Net 集成?
- ubuntu-18.04 - 无法在 ubuntu 18.04 中安装 texStudio
- python - 如何使用 PyQt5 在 QErrorMessage 中显示字符串列表
- inheritance - PyQT从同一文件中的其他类(Qthread)访问UI元素
- optimization - ROW_NUMBER 与 PARTITION BY &ORDER BY 在蜂巢中执行非常慢(300 万行)
- angular - Angular Reactive 表单不等待自定义异步验证器
- mysql - 让自己成为 MySQL 中的另一个超级用户,但仅在通过 unix 套接字连接时
- javascript - 捕捉一帧视频
- c# - 如何解决 Visual Studio 中的运行时错误
- node.js - 从节点 js 服务器在反应应用程序上显示图像