Как добавить объект в список после каждого получателя (как повторить похожую логику в получателях) - PullRequest
0 голосов
/ 06 октября 2019
# 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 () в зависимости от того, что необходимо, поэтому у меня есть эти получатели.

Добавление этой строки msgList.append(msg) внутри каждой функции приводит к ошибке программирования человека ивозможно, излишне прибавляет к длине файла с исходным кодом.

Как мне каждый вызов геттера msgList.append(msg)? Есть какой-то причудливый способ обернуть всю эту логику в функцию-обертку, о которой я не думаю? Я почти уверен, что декораторы не будут работать, потому что они не видят переменные внутри функции, и мне придется повторять эти декораторы тоже для каждой выполняемой мной функции.

ПРИМЕЧАНИЕ. Ответ должен быть вpython2. Не могу использовать Python3 на работе.

ПРИМЕЧАНИЕ. Намерение состоит в том, чтобы эти getter () находились внутри файла, подобного константам, где наши различные тестовые сценарии вызывают эти геттеры.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Самое простое решение - просто обобщить функцию. Единственная разница между каждой 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-арности возвращается и помещается вalias.

Конечно, ручное жесткое кодирование все это также приводит к источникам ошибок. Вы можете пересмотреть порядок настройки, если это необходимо.

0 голосов
/ 06 октября 2019

Почему itemList должен быть заполнен внутри геттеров в первую очередь?

Что вы можете сделать, когда вы вызываете такие геттеры, добавить строку для добавления соответствующего элемента в список

a = getItemA()
itemList.append(a)
...