Должен ли я использовать класс для разделения нескольких переменных между функциями? - PullRequest
0 голосов
/ 16 января 2019

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

Чтобы сделать функцию более компактной и менее загроможденной, я бы поместил запросы для всех параметров в отдельную функцию. Тем не менее, я не знаю лучший / правильный способ вернуть несколько переменных.

При поиске в моих книгах и переполнении стека я нахожу следующие опции:

  1. Я мог бы вернуть один dict со всеми переменными, но подумал, есть ли другой способ.
  2. Глобальные переменные: поскольку я не использую параметры в других местах, это кажется плохой практикой.
  3. Возвращает кортеж переменных, но тогда они не будут названы.
  4. В большинстве ответов, которые я нашел в Stack Overflow, рекомендуется создать класс. Это превратит мою функцию в класс.

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

Ответы [ 3 ]

0 голосов
/ 16 января 2019

вернуть кортеж; в вашей вызывающей функции вы можете использовать неявную распаковку кортежей

top_limit, bottom_limit, another_value = the_query_function()

А внутри вызываемой функции просто:

return top_limit, bottom_limit, another_value

Довольно чисто и легко, без шаблона

Или вы можете использовать класс, как вы сказали, на самом деле зависит от сложности работы под рукой

РЕДАКТИРОВАТЬ: использование задания для однократного вызова задача не плохой стиль, если код выигрывает от использования класса

0 голосов
/ 16 января 2019

ответ на такой вопрос всегда зависит от сложности.

Но когда вы говорите:

У меня есть одна большая функция, которая выполняет ряд измерений.

это может быть признаком задуматься о реструктуризации.

Я всегда предпочитаю, чтобы одна функция просто делала одну простую вещь. Zen of Python учит нас "Простое лучше, чем сложное" и "Сложное лучше, чем сложное".

В этом случае я бы использовал класс, а не слишком сложную функцию.

Как правило: если ваша функция или метод превышает 20 строк кода или возвращает более двух или трех параметров, вам следует подумать о реструктуризации. В большинстве случаев вы хотите, чтобы эта функция была «мастером на все руки». Время от времени эти функции взрываются, и обработка их становится все более сложной.

0 голосов
/ 16 января 2019

Другой вариант - использование вложенных dict s для группировки параметров по некоторым критериям.

Например:

d = {
    'movement_limits': {
        'top': 5,
        'bottom': 1,
    },
    'window_size': {
        'height': 10,
        'width': 10,
    },
    'num_players': 9,
}

И получить к нему доступ так:

print(d['window_size']['height'])
print(d['movement_limits']['top'])

Это имеет небольшие накладные расходы (не весь класс) и все еще несколько читабельно.

...