我在一个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
复制相似问题