首页 > 解决方案 > 创建和调用带有参数的函数堆栈

问题描述

我正在寻找一种方法来获得可以在以后执行的功能列表。我不确定将参数传递给这些函数的好方法。这个想法是让各种对象注册函数并让另一个对象决定是否执行这些函数以及执行这些函数的顺序。

我想出了这个

class Place():

    def __init__(self):
        self.things = []

    def register_add_thing(self, thing):

        def add_thing(place, thing):
            place.things.append(thing)

        return (add_thing, [self, thing])

    def register_add_ting(self, ting):

        def add_thing():
            nonlocal self
            nonlocal ting
            self.things.append(ting)

        return add_thing


p = Place()
functions = []
functions.append(p.register_add_ting('toast'))
for f in functions:
    f()

print(p.things)

functions = []
functions.append(p.register_add_thing('bread'))
for f in functions:
    f[0](*f[1])

print(p.things)

有没有更好的方法来处理争论?

标签: pythonpython-3.x

解决方案


如果您的论点在注册时已确定,那么您有几个选择。我假设您不喜欢返回注册函数及其参数的设计.. 后来称为f[0](*f[1])

def register_add_thing_func(self, thing):
    def wrapper(place, thing):
        def inner():
            place.things.append(thing)
        return inner
    return wrapper(self, thing)

def register_add_thing_lambda(self, thing):
    return lambda : self.things.append(thing)

...

functions.append(p.register_add_thing_func('bread'))
functions.append(p.register_add_thing_lambda('bread'))

for f in functions:
    f()

print(p.things)

推荐阅读