Можно ли уменьшить количество аргументов это на шаблонной функции? - PullRequest
1 голос
/ 26 января 2011

В настоящее время я пытаюсь создать автоматический экземпляр модели django.Эта функция примет пару аргументов, создаст несколько моделей django, свяжет некоторые внешние ключи вместе, сохранит партию и вернет мне основную модель.Это все нормально, но в конце концов, функция принимает 4 обычных аргумента и 2 кортежа (заполненных именем типа контента и массивом аргументов для вызова другой функции).

Это приводит к следующей функции def:

def create_rule(profile, lifestyles, bool, title, input, output):
    rule = Rule.objects.create(
        user_profile=profile, 
        lifestyles=lifestyles,
        bool=bool,
        title=title,
    )

    models = ContentType.objects.filter(app_label="rules")
    input_cls = models.get(model=input[0]).model_class()
    input_cls.objects.create(*input[1], rule=rule)

    output_cls = models.get(model=output[0]).model_class()
    output_cls.objects.create(*output[1], rule=rule)

    return rule

Средний вызов функции может выглядеть примерно так:

create_rule(profile, '1,3,6,7', 1, "Switch off when 5:00", 
    ('eventruleinput', [5, 'start']), 
    ('propruleoutput', [35, 'Switch', 0]))

Есть ли хороший способуменьшить количество аргументов, которые я использую (не правда, я думаю)?Есть ли лучший способ структурировать этот вызов функции?Я делаю это совершенно неправильно?

Примечание: это всего лишь реализация макета, мне интересно, не хочу ли я подойти к этой проблеме следующим образом.

1 Ответ

2 голосов
/ 26 января 2011

Иногда функция должна принимать много аргументов.В этом нет ничего плохого, per se .Вот несколько советов, как сделать его немного чище:

Не называйте bool, "bool":

def create_rule(profile, lifestyles, is_something, title, input, output):
    rule = Rule.objects.create(
    ....
    bool=is_something,
)

Для ясности распакуйте ваши кортежи:

input_val, input_command = input
input_cls = models.get(model=input_val).model_class()
input_cls.objects.create(*input_command, rule=rule)
output_val, output_command, output_third_arg = output
....
...