gpt4 book ai didi

python - 在类方法中嵌套的函数中调用 locals()

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:54 24 4
gpt4 key购买 nike

这是一个片段:

class Foo(object):
def bar(self, x):
def baz(y):
print locals()['self']
..
return baz(..)

foo = Foo()
foo.bar(..)

我有 2 个盒子。在使用 Python 2.5 的 Windows Vista 上,调用 foo.bar(..) 是可行的。在使用 Python 2.7 的 Ubuntu 上调用 foo.bar(..) 会抛出一个 KeyError,无法在 locals() dict 中找到 self

有什么想法吗?

编辑:我欠你一个道歉;看来我在尝试构建问题时误导了您。嵌套函数中的实际代码计算来自 DSL 的字符串:

            r = re.compile(r'\$(\w+)')
eval_string = r.sub(r'self.player.stats["\1"]', s)
result = eval(eval_string)

它在 Vista/Python 2.5 上运行,在 Ubuntu/Python 2.7 上失败。

最佳答案

承认你可以在运行失败之前计算变量 dict,你可以使用这个:

class Foo(object):
def bar(self, x):
outer_locals = locals()
def baz(y):
print outer_locals['self']
..
return baz(..)

相反,如果您必须在运行时计算字典(在 bad 内),这是要走的路:

import inspect

def outer_locals(depth=0):
"""
With depth=0 behaves like locals(), depth=1 are the locals of the
containing frame, depth=2 the locals of the frame containing the containing
frame and so on...
"""
return inspect.getouterframes(inspect.currentframe())[depth+1][0].f_locals

class Foo(object):
def bar(self, x):
def baz(y):
print outer_locals(1)
return baz(...)

注意,如果在baz函数中没有被覆盖,所有的bar局部变量在bad中都是可用的:

class Foo(object):
def bar(self, x):
def baz(y):
print self
..
return baz(..)

关于python - 在类方法中嵌套的函数中调用 locals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com