gpt4 book ai didi

python-asyncio - 从协程中提取函数和参数

转载 作者:行者123 更新时间:2023-12-02 17:20:16 25 4
gpt4 key购买 nike

是否可以提取python3.6中协程对象的函数和参数?

上下文:目前我有这样的东西:

async def func(*args):
...

ret = await remotely(func, x, y)

在幕后,remotely泡菜func , x , 和 y , scp 到另一个服务器,在那里它 unp​​ickles,执行 func(x,y) ,腌制结果,scp 返回,最后将其解腌制为 ret .

我觉得这个 API 令人反感,我更愿意拥有:

ret = await remotely(func(x, y))

如果我可以 pickle func(x, y) 表示的协程对象,我就可以做到这一点,但是当我尝试这样做时,我得到:

TypeError: can't pickle coroutine objects

所以我的另一个希望是我可以提取 f , x , 和 y来自 f(x, y) ,因此这个问题。

最佳答案

因此,当您执行 ret = await remotely(func(x, y)) 时,您实际上是为 func 构造协程对象。幸运的是,您可以从协程对象中提取所需的信息,您可以发送这些信息以供远程执行。

因此,首先您可以使用 __qualname__ 获取函数名称属性。这将为您提供完全限定名称,即如果协程是嵌套的,它将为您提供函数的完整路径。

接下来,您可以从协程的框架对象中提取参数值。

这就是您的remote 函数的样子

async def remote(cr):
# Get the function name
fname = cr.__qualname__

# Get the argument values
frame = cr.cr_frame
args = frame.f_locals # dict object

result = await ... # your scp stuff

return result

只有一个警告。您应该指出该功能只能按照您发布的方式使用,即

ret = await remotely(func(x, y))

...换句话说,协程应该是“新鲜的”,而不是执行到一半(如果您启动它并直接将其传递给 remote,这几乎是不可能的)。否则,f_locals 值可能包含在任何 await 之前定义的任何其他局部变量。

关于python-asyncio - 从协程中提取函数和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43353212/

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