我在一个python文件sayHello中定义了一个函数utils.py。我还有一个python文件flow.py,它运行一个简单的元流。我希望从sayHello中导入utils.py,并在flow.py中使用sayHello作为step函数。有可能这样做吗?这可能很难,因为我们需要类中的self。如果可能的话,一个问题是我们如何将输出从上一步传递到函数并将输出传递到下一步。以下是我的尝试。
#utils.py
def sayHello():
print("hello world")#flow.py
from metaflow import FlowSpec, step, Parameter
from metaflow import Metaflow
from utils import sayHello
def function(p):
return p
class BranchFlow(FlowSpec):
@step
def start(self):
self.next(self.a, self.b, self.sayHello)
@step
def a(self):
self.x = 1
self.next(self.join)
@step
def b(self):
self.x = 2
self.next(self.join)
@step
def join(self, inputs):
print('a is %s' % inputs.a.x)
print('b is %s' % inputs.b.x)
print('total is %d' % sum(input.x for input in inputs))
self.next(self.end)
@step
def end(self):
pass
if __name__ == '__main__':
BranchFlow() 发布于 2022-08-19 16:17:15
根据the documentation for FlowSpec.next(),传递给self.next()的方法必须是当前类的成员,并使用@step进行修饰。
使用来自另一个模块的另一个函数的最简单方法可能是将其封装在一个成员函数中:
class BranchFlow(FlowSpec):
# ...
@step
def sayHello(self):
sayHello()现在你可以做self.next(self.sayHello)了。
发布于 2022-08-19 16:16:49
如果需要sayHello方法引用self,则向sayHello方法中添加一个参数(如果是utils.py )。我相信您导入的方法是正确的,所以看起来不错。只要稍微改变一下:
#utils.py
def sayHello(self, ...other_args_if_needed):
# Assuming `self` has a `getName` getter method.
print(f"hello world, I am {self.getName()}")现在您可以导入sayHello方法,并且它可以在类对象中使用。请记住,您需要已经定义了getter和setter方法。当类初始化时,self可能只是一个空字典,所以如果getName没有在self上定义,sayHello就会抛出一个异常。
https://stackoverflow.com/questions/73419473
复制相似问题