首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >返回Python中的封闭作用域变量

返回Python中的封闭作用域变量
EN

Stack Overflow用户
提问于 2018-07-20 06:27:49
回答 2查看 473关注 0票数 1

给定的

我有一个函数scope,它可以在封闭的命名空间中声明,即模块、类或函数。感兴趣的变量直接位于此函数的外部。

一般情况下,如何访问在任何封闭的命名空间中声明的变量/参数及其值?

示例

捕获函数变量(b)和参数(c)的示例伪代码:

代码语言:javascript
复制
a = 1
def func(c=3)
    b = 2
    def scope():
        return ...
    return scope()

预期输出

代码语言:javascript
复制
func()
# {'c': 3, 'b': 2}

尝试

我在模块级上取得了一定的成功,例如a = 1

代码语言:javascript
复制
# module-level
a = 1
def scope():
    return {k: v for k, v in globals().items() if not k.startswith("_")}

scope()
# {'a': 1, ...}

我还可以从方法访问类属性,例如b = 2

代码语言:javascript
复制
# class-level
a = 1
class Klass:
    b = 2
    def scope(self):
        obj = self.__class__
        return obj.__dict__

Klass().scope()
# {'b': 2, ...}

我只能部分地访问封闭函数中的变量和参数:

代码语言:javascript
复制
# 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的习惯用法和这个问题的本质。我仍然对它的可能性很感兴趣,我感谢任何愿意超越标准的人。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51432553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档