0

我不是 100% 确定这是否称为惰性评估,但我希望在 Python 中做到这一点。

我有一个“设置向导”,用户将通过它然后创建一些全局变量,这些变量将用作类中的参数。

var = myClass(param1, param2)在全局变量 param1 和 param2 存在之前,不应评估。但是,我需要 var 存在,因为我正在关联var0 = var.funcmyClass 中的一个函数。稍后在应用程序中,调用 var0 并执行 func()。

更新

这是我的一些代码:

class myClass:

    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2
    #------------------------------------------------------------------------
    def myFunction(self):
        """
        Some work here using self.param1 and self.param2
        """
    def myFunction2(self):
        """
        Some work here using self.param1 and self.param2
        """
    def myFunction3(self):
        """
        Some work here using self.param1 and self.param2
        """

myInstance = myClass(PARAM1, PARAM2)

myDict = {}
myDict["key1"] = myInstance.myFunction
myDict["key2"] = myInstance.myFunction2
myDict["key3"] = myInstance.myFunction3
# and so on...

PARAM1并由PARAM2用户通过 wxPython 向导内的操作填充为全局变量。问题是myInstance无法在初始化时进行评估,因为PARAM1PARAM2还不存在。但是,字典键在初始化时与各种函数相关联,因为它们不会随着时间而改变。

想法?

4

4 回答 4

2

不,你不想这样做。

如果你真的需要这样做,你应该做的是使用承诺或期货来延迟对这些表达式的评估。这是因为即使变量var存在,表达式只有在持有一个带有 member 的对象时var.func才会毫无例外地计算。python 有许多承诺或未来的库——我建议你自己用谷歌搜索它们,以便选择最适合你的库。varfunc

但是,更好的方法是在类存在或设置全局变量之前不执行任何这些操作。

不幸的是,由于您几乎没有提供您正在做什么的细节,因此不可能提供任何更具体的建议。

于 2012-07-11T17:38:32.097 回答
1

这是一个坏主意

但是,这里有一些代码可以做你想做的我认为......

class myClass(object):
    @property
    def var0(self):
        return param1

a=myClass()
try:
    print (a.var0) #NameError because param1 isn't defined yet.
except NameError:
    pass

param1="foo"   
print a.var0

我们可以使这更加“聪明”(见下文)——现在您只需传递一个字符串,其中包含将在某个时候创建​​的变量的名称。

class myClass(object):
    def __init__(self,varname):
        self.varname=varname
    @property
    def var0(self):
        return globals()[self.varname]

a=myClass('param1')
try:
    print (a.var0) #KeyError now
except KeyError:
    pass

param1="foo"
print a.var0

这会延迟访问全局变量param1,直到它在类上实际使用。但是,通常,您不想这样做。将实例创建推迟到您要传递的变量被定义之后。

于 2012-07-11T17:36:47.037 回答
0

代替

var = MyClass(p1, p2)

p1 = get_p1()
p2 = get_p2()

# magic happens

为什么不

var = MyClass()

p1 = get_p1()
var.p1 = p1

p2 = get_p2()
var.p2 = p2
于 2012-07-11T18:56:16.833 回答
0

我使用@staticmethod装饰器在我的代码中解决了这个问题,但我不会接受它作为答案,因为我不知道这是否是目前最好的答案!

class myClass:
    #------------------------------------------------------------------------
    @staticmethod
    def myFunction(param1, param2):
        """
        Some work here using param1 and param2
        """
    @staticmethod
    def myFunction2(param1, param2):
        """
        Some work here using param1 and param2
        """
    @staticmethod
    def myFunction3(param1, param2):
        """
        Some work here using param1 and param2
        """

myDict = {}
myDict["key1"] = myClass.myFunction
myDict["key2"] = myClass.myFunction2
myDict["key3"] = myClass.myFunction3
# and so on...

在用户通过设置向导并填充PARAM1andPARAM2之后,我可以遍历字典并使用其关联函数通过传递PARAM1和计算相应的值对,PARAM2如下所示:

for k in myDict.keys():
    myDict[k](PARAM1, PARAM2)
于 2012-07-11T23:37:00.483 回答