我正在编写一个使用遗传技术来演化方程的程序。 我希望能够将函数'mainfunc'提交给Parallel Python'submit'函数。 函数'mainfunc'调用Utility类中定义的两个或三个方法。 它们实例化其他类并调用各种方法。 我认为我想要的只是一个NAMESPACE中的所有内容。 所以我在函数'mainfunc'中实例化了一些(可能应该是全部)类。 我将Utility方法称为'generate()'。如果我们要遵循它的执行链 它将涉及代码中的所有类和方法。
现在,方程存储在树中。每次生成,变异或交叉树 bred,需要为节点提供一个新密钥,以便可以从树的字典属性访问它们。 “KeySeq”类生成这些键。
在Parallel Python中,我将把'mainfunc'的多个实例发送到PP的'submit'函数。每个人都必须能够访问'KeySeq'。如果他们都访问了相同的KeySeq实例,那么返回的树上没有任何节点具有相同的密钥会很好,但如果有必要,我可以解决这个问题。
所以:我的问题是关于将所有内容填充到mainfunc中。 谢谢 (编辑)如果我不在mainfunc中包含所有内容,我必须通过在各个地方传递各种争论来尝试告诉PP有关依赖函数等。我试图避免这种情况。
(后期编辑)如果在'generate()函数内调用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)
答案 0 :(得分:3)
以这种方式构建程序是很好的。许多命令行实用程序遵循相同的模式:
#imports, utilities, other functions
def main(arg):
#...
if __name__ == '__main__':
import sys
main(sys.argv[1])
这样你可以通过导入来调用另一个模块的main
函数,或者你可以从命令行运行它。
答案 1 :(得分:1)
如果您希望mainfunc
的所有实例都使用相同的KeySeq
对象,则可以使用默认参数值技巧:
def mainfunc(ks=KeySeq()):
key = ks.next()
只要您实际上没有传入ks
的值,所有对mainfunc
的调用都将使用在定义函数时创建的KeySeq
实例。< / p>
这就是为什么,如果您不知道:函数是一个对象。它有属性。其中一个属性名为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()) key = mainfunc.ks.next()
最后,一个非常重要的一点是,您发布的代码忽略了:如果您要对共享数据进行并行处理,那么触及该数据的代码需要实现锁定。查看Parallel Python文档中的callback.py
示例,了解如何在Sum
类中使用锁定,以及原因。
答案 2 :(得分:0)
我认为你在Python中的类概念并不合理。也许,回顾基础知识是个好主意。这个链接会有所帮助。