是否可以声明函数应使用调用者的作用域?

问题描述 投票:-1回答:1

是否有与C宏类似的功能,可让您以内联方式重用代码,而无需为该代码段创建单独的作用域?

例如:

a=3
def foo():
    a=4
foo()
print a

将打印3,但是我希望它打印4。

我知道涉及类或全局dict之类的对象的解决方案,但是我正在寻找更原始的解决方案(例如,函数装饰器),该解决方案只是让我在调用者的范围内进行更改。] >

非常感谢

edit:任何需要声明要使用哪个变量的解决方案,或者事先声明诸如mutabale对象之类的“命名空间”都不是我正在寻找的解决方案。

我独自尝试:

def pgame():
a=3
c=5
print locals()
game(a)
print locals()


class inline_func(object):
    def __init__(self, f):
        self.f = f

    def __call__(self, *args, **kwargs):
        return self.f(*args, **kwargs)


@inline_func
def game(b, a=4):
    exec("inspect.stack()[3][0].f_locals.update(inspect.stack()[1] [0].f_locals)\nctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(inspect.stack()[3][0]),ctypes.c_int(0))\ninspect.stack()[1][0].f_locals.update(inspect.stack()[3][0].f_locals)\nctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(inspect.stack()[1][0]),ctypes.c_int(0))")
try:
    print "your code here"
finally:
    exec("inspect.stack()[3][0].f_locals.update(inspect.stack()[1][0].f_locals)\nctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(inspect.stack()[3][0]),ctypes.c_int(0))")

@inline_func
def strip_game(b, a=4):
    print "your code here"

但是我在如何在不破坏程序的可调试性的情况下将代码注入到strip_game中遇到了一个严重的问题,因为我只想到创建一个新的代码对象或使用exec,这两个问题都遇到了一些严重的问题。] >

@@ jsbueno答案解决了所有问题,非常了不起。

是否有与C宏类似的功能,可让您以内联方式重用代码,而无需为该代码段创建单独的作用域?例如:a = 3 def foo():a = 4 foo()打印一个...

python scope built-in dynamic-scope
1个回答
-1
投票

在这种情况下,只需使用global关键字:

a=3
def foo():
    global a
    a=4
foo()
print (a)

0
投票

有点牵强,也许胸围列表参数是可变的。如果您将第一项放在列表中,则可以对其进行更改。

© www.soinside.com 2019 - 2024. All rights reserved.