How to add object to a list after each getter (how to repeat similar logic in getters)

How to add object to a list after each getter (how to repeat similar logic in getters)

# Message Object Creation File
messageList = []

def getMessageObjectA():
    msg = MessageCreator(msgAttribute1, msgAttribute2)
    msgList.append(msg)
    return msg

def getMessageObjectB():
    msg = MessageCreator(msgAttribute3, msgAttribute4)
    msgList.append(msg)
    return msg

def getMessageObjectC():
    msg = MessageCreator(msgAttribute5, msgAttribute6)
    msgList.append(msg)
    return msg

def clearMessages():
    for msg in messageList:
        # logic to clear messages
# Test Script #1
import MessageObjects as MsgObj

a = MsgObj.getMessageObjectA()
c = MsgObj.getMessageObjectC()

# Do stuff

MsgObj.clearMessages()

# Do more stuff

# Test Script #223423423
import MessageObjects as MsgObj

e = MsgObj.getMessageObjectE()
u = MsgObj.getMessageObjectU()
y = MsgObj.getMessageObjectY()

# Do stuff

MsgObj.clearMessages()

# Do more stuff

在实际代码中,我将有一百多个 getMessageObject() 函数。在某些地方,我只会根据需要调用其中一些 getMessageObject() 函数,这就是为什么我有那些 getters.

在每个函数中添加这一行 msgList.append(msg) 会引入人为编程错误,并可能不必要地增加源代码文件的长度。

如何让每个 getter 呼叫 msgList.append(msg)?是否有某种奇特的方式将所有这些逻辑包装在我没有想到的包装函数中?我很确定装饰器不会工作,因为它们看不到函数内部的变量,而且我也必须为我创建的每个函数重复这些装饰器。

注意:答案必须在 Python2 中。不能在工作中使用 Python3。

注意:目的是将这些 getters() 放在类似常量的文件中,我们的许多不同的测试脚本在其中调用这些 getters.

最简单的解决方案就是泛化函数。每个 getItem# 函数之间的唯一区别是传递给 GenerateItem 的参数。只需将该数据传递给 getItem:

def getItem(arg1, arg2):
    item = GenerateItem(arg1, arg2)
    itemList.append(item)
    return item

a = getItem(val1, val2)
b = getItem(val3, val4)

如果您需要具有特定名称的函数,只需创建别名即可。这可以使用 functools.partial:

轻松完成
from functools import partial

getItemA = partial(getItem, val1, val2)
getItemB = partial(getItem, val3, val4)

a = getItemA()
b = getItemB()

参数 partial 仅应用于 getItem,返回一个 0 元函数并放置在别名中。

当然,手动硬编码所有这些也会导致错误来源。如果有必要,您可能需要重新考虑设置方式。

为什么 itemList 首先要填充在 getter 中?

你可以做的是,当你调用这样的 getters 时,添加一行用于将相应的项目附加到列表中

a = getItemA()
itemList.append(a)