gpt4 book ai didi

python - 如何从回调函数访问(和编辑)变量?

转载 作者:太空狗 更新时间:2023-10-30 00:25:38 25 4
gpt4 key购买 nike

我使用 Boto 访问 Amazon S3。对于文件上传,我可以分配一个回调函数。问题是在将它们设为全局之前,我无法从该回调函数访问所需的变量。另一方面,如果我将它们设为全局,它们对于所有其他 Celery 任务也是全局的(直到我重新启动 Celery),因为文件上传是从 Celery 任务执行的。

这是一个上传包含视频转换进度信息的 JSON 文件的函数。

def upload_json():
global current_frame
global path_to_progress_file
global bucket
json_file = Key(bucket)
json_file.key = path_to_progress_file
json_file.set_contents_from_string('{"progress": "%s"}' % current_frame,
cb=json_upload_callback, num_cb=2, policy="public-read")

这里有 2 个回调函数,用于上传 ffmpeg 在视频转换期间生成的帧和一个包含进度信息的 JSON 文件。

# Callback functions that are called by get_contents_to_filename.
# The first argument is representing the number of bytes that have
# been successfully transmitted from S3 and the second is representing
# the total number of bytes that need to be transmitted.
def frame_upload_callback(transmitted, to_transmit):
if transmitted == to_transmit:
upload_json()
def json_upload_callback(transmitted, to_transmit):
global uploading_frame
if transmitted == to_transmit:
print "Frame uploading finished"
uploading_frame = False

理论上,我可以将 uploading_frame 变量传递给 upload_json 函数,但它不会到达 json_upload_callback,因为它是由 Boto 执行的。

事实上,我可以这样写。

In [1]: def make_function(message):
...: def function():
...: print message
...: return function
...:

In [2]: hello_function = make_function("hello")

In [3]: hello_function
Out[3]: <function function at 0x19f4c08>

In [4]: hello_function()
hello

但是,它不允许您编辑函数的值,只允许您读取值。

def myfunc():
stuff = 17
def lfun(arg):
print "got arg", arg, "and stuff is", stuff
return lfun

my_function = myfunc()
my_function("hello")

这有效。

def myfunc():
stuff = 17
def lfun(arg):
print "got arg", arg, "and stuff is", stuff
stuff += 1
return lfun

my_function = myfunc()
my_function("hello")

这给出了一个 UnboundLocalError:赋值前引用的局部变量 'stuff'。

谢谢。

最佳答案

在 Python 2.x 中闭包是只读的。但是,您可以对可变值使用闭包...即

def myfunc():
stuff = [17] # <<---- this is a mutable object
def lfun(arg):
print "got arg", arg, "and stuff[0] is", stuff[0]
stuff[0] += 1
return lfun

my_function = myfunc()
my_function("hello")
my_function("hello")

如果您改用 Python 3.x,关键字 nonlocal 可用于指定在闭包中读/写中使用的变量不是本地变量,但应从封闭范围捕获:

def myfunc():
stuff = 17
def lfun(arg):
nonlocal stuff
print "got arg", arg, "and stuff is", stuff
stuff += 1
return lfun

my_function = myfunc()
my_function("hello")
my_function("hello")

关于python - 如何从回调函数访问(和编辑)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815329/

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