题
我正在写使用遗传技术演变等式的程序。 我希望能够提交功能“mainfunc”到并行Python的“提交”功能。 功能“mainfunc”调用了实用工具类定义了两种或三种方法。 他们实例化其他类和调用各种方法。 我想我要的是这一切在一个命名空间。 所以,我实例化的功能“mainfunc”中的类的一些(也许这应该是所有)。 我称之为实用方法“产生()”。如果我们按照它的执行链 这将涉及所有的类和方法的代码。
现在,方程被存储在树中。每次树产生的,突变的或交叉 孕育,节点需要被赋予了新的密钥,以便他们可以从树的字典属性来访问。该类的KeySeq'生成这些密钥。
在并行Python中,我要去“mainfunc”的多个实例发送到PP的“提交”功能。每个必须能够访问“KeySeq”。这将是很好,如果他们都访问KeySeq的同一个实例,以使没有对返回的树节点具有相同的钥匙,但我可以得到解决,如果必要的。
所以:我的问题是关于馅万事成mainfunc。 谢谢 (编辑)如果我不包括在mainfunc的一切,我必须努力告诉PP约相关的功能,等通过传递各种arguements在不同的地方。我试图避免这种情况。
(后期编辑)如果ks.next()被调用“的内侧产生()函数,则返回错误‘NameError:全局名称‘KS’没有定义’
class KeySeq:
"Iterator to produce sequential \
integers for keys in dict"
def __init__(self, data = 0):
self.data = data
def __iter__(self):
return self
def next(self):
self.data = self.data + 1
return self.data
class One:
'some code'
class Two:
'some code'
class Three:
'some code'
class Utilities:
def generate(x):
'___________'
def obfiscate(y):
'___________'
def ruminate(z):
'__________'
def mainfunc(z):
ks = KeySeq()
one = One()
two = Two()
three = Three()
utilities = Utilities()
list_of_interest = utilities.generate(5)
return list_of_interest
result = mainfunc(params)
解决方案
如果你希望所有mainfunc
的实例中使用相同的KeySeq
对象,你可以使用默认参数值的技巧:
def mainfunc(ks=KeySeq()):
key = ks.next()
只要你不实际传递ks
的值,所有呼叫mainfunc
将使用定义的函数时创建KeySeq
的实例。
下面就是为什么,如果你不知道:一个函数是一个对象。它具有的属性。它的一个属性被命名为func_defaults
;它包含所有的在其签名有缺省参数的默认值的元组。当你调用一个函数,并且不提供具有默认的参数值,则函数从func_defaults
值。所以,当你调用mainfunc
而无需ks
提供一个值,它得到了KeySeq()
实例出func_defaults
元组。其中,对于mainfunc
的该实例,总是相同的KeySeq
实例。
现在,你说你要发送的“mainfunc
的多个实例,以PP的submit
功能。”你真的是多个实例?如果是这样,我所描述的机制将无法工作。
但它的棘手创建一个函数(和你发布的代码不)的多个实例。例如,此功能对每一个它被称为时间返回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()
最后,你的代码已经发布俯瞰超级重要的一点:如果你打算共享的数据是做并行处理,触及该数据需要实现锁定的代码。看并行Python文档在callback.py
示例和看到锁定如何在Sum
类使用,并且这是为什么。
其他提示
这是罚款来构建程序的方式。很多命令行实用程序遵循相同的模式:
#imports, utilities, other functions
def main(arg):
#...
if __name__ == '__main__':
import sys
main(sys.argv[1])
这样,你可以通过导入它从另一个调用模块的功能main
,也可以在命令行运行它。
您在Python的类概念不健全,我认为。或许,这将是复习基础知识是个好主意。此链接将有所帮助。