在Python中返回封闭的范围变量

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (53)

特定

我有一个函数,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会给你这样做的方法,但你真的不想这样做。函数/ classes / etc不应该将它们的内部暴露给调用代码,因为它会破坏抽象并使代码变得脆弱。函数应该接受参数并返回输出值,但不应公开内部算法,尤其是变量名。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动