我正在写使用遗传技术演变等式的程序。 我希望能够提交功能“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元组中的默认值(初始空的列表)。由于g1g2g功能的不同实例,对于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的类概念不健全,我认为。或许,这将是复习基础知识是个好主意。此链接将有所帮助。

Python的基础 - 类

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top