0

显然,这有效:

def test_A():
    magic = str(uuid.uuid4())

    def handler(request):
        return magic

    assert handler(0) == magic

虽然这因“分配前引用的局部变量”而失败:

def test_A():
    magic = str(uuid.uuid4())

    def handler(request):
        magic = magic
        return magic

    assert handler(0) == magic

在第二个片段中,我假设它magic成为一个局部变量,独立于上层范围内的变量进行操作。

我知道要修改全局变量,我必须将其声明为global,但我在这里要做的是创建具有相同名称的独立局部变量。这根本不可能吗,我必须为局部变量选择不同的名称?

4

3 回答 3

1

handler()可以返回堆栈上的一层并获取其调用者的同名局部变量。

def test_A():
    magic = str(uuid.uuid4())

    def handler(request):
        magic = sys._getframe(1).f_locals['magic']
        return magic

    assert handler(0) == magic
于 2012-10-03T14:27:25.797 回答
0

通常,用相同的名称调用全局变量和局部变量是一种非常糟糕的做法。如果这些在类中,您可以更轻松地指定范围。

但是,您可以使用 globals() 函数访问全局变量,该函数返回带有全局变量的字典,因此您得到:

magic=globals()['magic']
于 2012-10-03T12:58:43.503 回答
0

如果test_A.magic保持不变,您可以使用它的值来定义具有默认值的关键字参数:

def test_A():
    magic = str(uuid.uuid4())

    def handler(request, magic = magic):
        # magic here will be a local variable, whose
        # default value will be set to the value of test_A.magic 
        # at the time the def handler statement was parsed.
        return magic

    assert handler(0) == magic    
于 2012-10-03T12:57:19.600 回答