如果希望mainfunc的所有实例都使用相同的KeySeq对象,则可以使用默认参数值技巧:
def mainfunc(ks=KeySeq()):
key = ks.next()
只要您实际上没有传递ks值,对mainfunc的所有调用都将使用在定义函数时创建的KeySeq实例.
如果您不知道,这就是为什么:函数是一个对象.它具有属性.它的属性之一被命名为func_defaults.它是一个元组,其中包含其签名中所有具有默认值的参数的默认值.当您调用函数且不为具有默认值的参数提供值时,该函数将从func_defaults中检索该值.因此,当您在不提供ks值的情况下调用mainfunc时,它将从func_defaults元组中获取KeySeq()实例.对于mainfunc实例,该实例始终是相同的KeySeq实例.
现在,您说要发送“ mainfunc的多个实例到PP的提交功能”.您是说多个实例吗?如果是这样,我所描述的机制将无法正常工作.
但是创建一个函数的多个实例很棘手(而您发布的代码则没有).例如,此函数在每次调用g时都会返回一个新的g实例:
>>> def f():
def g(x=[]):
return x
return g
>>> g1 = f()
>>> g2 = f()
>>> g1().append('a')
>>> g2().append('b')
>>> g1()
['a']
>>> g2()
['b']
如果我不带任何参数调用g(),它将从其func_defaults元组中返回默认值(最初是一个空列表).由于g1和g2是g函数的不同实例,因此x参数的默认值也是一个不同的实例,如上所示.
如果您想使此操作比使用默认值的棘手副作用更明确,则可以采用以下另一种方法:
def mainfunc():
??????如果没有hasattr(mainfunc,“ ks”):
??????????setattr(mainfunc,“ ks”,KeySeq())
??????键= mainfunc.ks.next()
最后,您发布的代码忽略了一个非常重要的要点:如果要对共享数据进行并行处理,则与数据相关的代码需要实现锁定.查看Parallel Python文档中的callback.py示例,看看如何在Sum类中使用锁定以及原因.