【问题标题】:Decorator function to wrap a function?装饰器函数来包装一个函数?
【发布时间】:2021-04-06 04:11:23
【问题描述】:

我必须编写一个虚拟函数来让我的代码在不同的系统上运行,其中一些系统没有所需的包。该函数被包装,然后像class-函数一样被调用。我正在努力解决这个问题,任何想法如何做到这一点?

这里我有一个简短的 sn-p,我导入了一个 python 脚本 ray.py,它应该包含这个 remote() 函数。 remote 函数必须接受两个参数,没有任何用法。

编辑:@ray.remote()run() 函数包装为并行可执行。它不会改变run() 的返回值。在某些系统上 ray 不受支持,我希望相同的脚本在不更改任何内容的情况下按顺序执行。因此我import 一个ray-dummy 而不是真正的。现在我想编写ray.remote() 来包装run() 函数,以便它可以用run.remote() 调用。

仅顺序执行一个功能可能是一种非常不方便的方法,但对于实现不同系统的轻松集成是必要的。

# here the wrapped function
@ray.remote(arg1, arg2)
def run(x):
    return x**2

# call it
squared = run.remote(2)

【问题讨论】:

  • "run.remote" 指的是函数对象 "run" 的方法(或任何 "ray.remote(...)" 返回的)。这可以实现,但意义不大。你应该试着更好地解释你想要什么。
  • 这正是我的问题:代码必须以这种方式与 ray 并行运行。装饰器函数以某种方式将运行函数打包到一个对象/类中,该对象/类包含函数本身作为“远程”,这就是我卡住的地方

标签: python decorator wrapper ray


【解决方案1】:

我有一个工作脚本,位于 ray.py 文件中:

def remote(*args, **kwargs):
    def new_func(func):
        class Wrapper:
            def __init__(self, f):
                self.func = f

            def remote(self, *arg):
                out = self.func(*arg)
                return out
        ret = Wrapper(func)
        return ret

    return new_func

【讨论】:

  • 我在您的回答中没有看到 @ray 装饰器。
  • 远程函数是我最小示例中调用的装饰器。它位于 ray.py 并使用 @ray.remote(...) 调用
猜你喜欢
  • 2017-11-05
  • 2018-05-24
  • 2011-06-25
  • 2017-09-13
  • 2021-06-22
  • 1970-01-01
  • 2010-10-27
  • 2021-04-19
  • 2018-03-07
相关资源
最近更新 更多