构建一个程序。 Python中的类和函数

时间:2009-10-13 16:14:11

标签: python parallel-python

我正在编写一个使用遗传技术来演化方程的程序。 我希望能够将函数'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)

3 个答案:

答案 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元组返回默认值(最初为空列表)。由于g1g2g函数的不同实例,因此x参数的默认值也是不同的实例,上面说明。

如果你想比使用默认值的棘手副作用更明确,这是另一种方法:

def mainfunc():       如果不是hasattr(mainfunc,“ks”):           setattr(mainfunc,“ks”,KeySeq())       key = mainfunc.ks.next()

最后,一个非常重要的一点是,您发布的代码忽略了:如果您要对共享数据进行并行处理,那么触及该数据的代码需要实现锁定。查看Parallel Python文档中的callback.py示例,了解如何在Sum类中使用锁定,以及原因。

答案 2 :(得分:0)

我认为你在Python中的类概念并不合理。也许,回顾基础知识是个好主意。这个链接会有所帮助。

Python Basics - Classes