我如何去模拟pass的等价物

我基本需要的是一个可变整数,它可以完成下面的等价操作,而不必求助于使用单个元素列表。

下面是一个人为的代码示例 ,代表了我的实际使用案例的本质[1]

>>> a = [5]  
>>> b = [77]  
>>> def swap(num1, num2):  
...     temp = num1[0]  
...     num1[0] = num2[0]  
...     num2[0] = temp  
>>> swap(a, b)  
>>> a  
[77]  
>>> b  
[5]  

[1]我的实际用例更接近于此 - >在用Tkinter中的按钮调用函数后返回值
我需要从与Tkinter小部件相关的回调函数中返回一个值,并且我想避免使用全局变量。


根据评论,你的目标是取回你不直接调用的函数的返回状态,并且你想避免使用全局变量。 在C语言中,你别无选择,只能使用引用,但是在python中,比局部变量和(C风格)全局变量具有更大的灵活性:你可以使用“闭包”来让你的回调函数直接赋值给局部变量。

在Python 3中

如果你使用python 3,你可以直接用nonlocal关键字来做到这一点。 最简单的情况是当你定义你的回调时:

myfunction():
    x = None
    def callback():
        nonlocal x    # Python 3 only 
        x = 5

    gtk.somefunction(callback)  # Executes callback()
    print "My callback returned", x

但是你的回调可能是在其他地方定义的,或者从很多不同的地方调用? 没问题,只需在现场定义一个捕获真实回调函数返回值的包装:

def real_callback():
    return 11

def myfunction():
    x = 0 

    def wrapper():
        nonlocal x     # Python 3 only
        x = real_callback()

    gtk.somefunction(wrapper)
    print "my callback returned", x

这可以通过将wrapper转换为装饰器来遮蔽,但这是另一回事。

Python 2解决方案

在python 2中没有nonlocal语句,而隐式闭包是只读的:如果你在没有nonlocal语句的情况下尝试上述操作,你会得到一个错误。 如果您将其声明为global变量,则可以分配给变量,就这些了。 所以,一些欺骗是必要的:

首先,函数locals()返回一个包含本地上下文所有变量的字典。 locals()['x']是局部变量x 。 但locals()通常是只读的。 幸运的是,有一个很好的(或可怕的)解决方法:由于它自己的原因, exec禁用了渲染locals()只读的优化......事实证明,它在调用函数的生命周期中保持禁用! (在Python 2.6.6上测试,YMMV。如果它不起作用,请改为exec "a = 0" )。 所以,你可以这样做:

def wrapper(callback, context, varname):
    def _callback():
        context[varname] = callback()
    return _callback

def mycode():
    exec ""
    some_library_function(wrapper(real_callback, locals(), 'z'))
    print "The callback returned", z

这是更好的只是使用可变容器为您的返回值? 我想,这是一个味道问题。 但是你可以多次使用相同的包装器,所以从某种意义上讲,它比Python 3解决方案更清洁......如果你忽略了魔法exec


恐怕你不得不使用一堂课。 Python是一种高级语言,不支持C(和C ++)中存在的指针参数,因此您需要使用一个对象来保存一个整数的值,然后您可以修改该值。


在回调的上下文中(请参阅Santiclaus的回答),您可能希望将类似Queue的东西传递给回调函数,并通过队列将回调函数发布到回调函数中。 您的主线程然后可以在此队列中等待它的结果。

链接地址: http://www.djcxy.com/p/51255.html

上一篇: How do I go about simulating the equivalent of pass

下一篇: Need help understanding Python closures