是否有与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()打印一个...
在这种情况下,只需使用global
关键字:
a=3
def foo():
global a
a=4
foo()
print (a)
有点牵强,也许胸围列表参数是可变的。如果您将第一项放在列表中,则可以对其进行更改。