Выбор между различными заменами случая переключателя в Python - словарь или if-elif-else?

Оператор $ push добавляет указанное значение в массив.

blockquote>
{ $push: { : , ... } }

$ push добавляет поле массива со значением как своим элементом.

blockquote>

Выше ответ отвечает всем требованиям, но я получил его работу, выполнив следующие

var objFriends = { fname:"fname",lname:"lname",surname:"surname" };
Friend.findOneAndUpdate(
   { _id: req.body.id }, 
   { $push: { friends: objFriends  } },
  function (error, success) {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    });
)
18
задан batbrat 27 February 2009 в 12:14
поделиться

7 ответов

Вздох. Слишком много заламывания рук по неправильной части проблемы. Оператор переключения не является проблемой. Существует много способов выразить "альтернативу", которые не добавляют значение .

проблема значение - не технический выбор оператора.

существует три общих шаблона.

  • Отображение ключа к объекту . Используйте словарь, если это почти полностью статично, и у Вас есть отображение между простым ключом и другой более сложной вещью. При создавании словаря на лету каждый раз, когда Вам нужен он, глуп. Можно использовать это, если это что Вы среднее : Ваши "условия" являются простыми, статическими значениями ключа та карта к объектам.

  • Различное поведение среди подклассов . Используйте Полиморфизм вместо объектов проверки типа. Корректный. Если у Вас есть подобные объекты в нескольких классах с различным поведением, они должны быть полиморфными. Используйте это максимально часто.

  • Другое различное поведение . Используйте if-elif-else лестничную структуру. Используйте это, когда у Вас не будет в основном статического ключа к построению карты ценности. Используйте это, когда условия будут сложны, или Вы средний процедуры, не объекты.

Все остальное - просто хитрый код, который может достигнуть подобных результатов.

Используя Кортеж. Это - просто словарь без отображения. Это требует поиска, и поиска нужно избежать, когда это возможно. Не делайте этого, это неэффективно. Используйте словарь.

Используя функционального декоратора ( http://code.activestate.com/recipes/440499/ ). Неприглядный. Это скрывает if-elif-elif природу проблемы, которую Вы решаете. Не делайте этого, не очевидно, что выбор эксклюзивен . Используйте что-либо еще.

Кто-то даже рекомендовал Посетитель шаблон. Используйте это, когда у Вас есть объект, который следует Составной объект шаблон разработки. Это зависит от полиморфизма для работы, таким образом, это не действительно другое решение.

24
ответ дан 30 November 2019 в 07:13
поделиться

В первом примере я, конечно, придерживался бы с если еще оператор. На самом деле я не вижу оснований, чтобы не использовать, если еще, если

  1. Вы не находите (использование, например, модуль профиля), что, если оператор является узким местом (очень маловероятный IMO, если у Вас нет огромного количества случаев, которые делают очень мало)

  2. код с помощью словаря более ясен / имеет меньше повторения.

Ваш второй пример я на самом деле переписал бы

setattr(self, name, value)

(вероятно, добавление оператора контроля для ловли недопустимых имен).

8
ответ дан 30 November 2019 в 07:13
поделиться

Рассмотрение, что это сделано в ответ на пользовательское действие (выбор что-то из меню), и количество выбора, который Вы ожидаете, является очень маленьким, я определенно пошел бы с простой if-elif-else лестничной структурой.

нет никакого смысла в optinizing для скорости, так как это только происходит с такой скоростью, как пользователь может сделать выбор так или иначе, это не "внутренний цикл трассировщика лучей" - территория. Несомненно, имеет значение давать пользователю быструю обратную связь, но так как количество случаев является настолько небольшим, нет никакой опасности этого также.

нет никакого смысла в оптимизации для краткости, начиная с (imo более ясный, нулевой служебный удобочитаемостью), если-лестничная-структура будет так очень коротка так или иначе.

2
ответ дан 30 November 2019 в 07:13
поделиться

Относительно Ваших вопросов о словаре:

Насколько я знаю, причины выбора dict для быстрого поиска. Когда это гарантировано? когда у меня есть 100 случаев или больше? Действительно ли это - хорошая идея продолжать создавать и выбрасывать словарь каждый раз, когда функция вызвана? Если я создаю dict с этой целью вне функции, я должен проверить, Необходимо ли это elswhere? Что происходит, если это не нужно в другом месте?

  1. Другой проблемой является пригодность для обслуживания. Наличие строки-> curveFunction словарь позволяет Вам диску данных меню. Тогда добавление другой опции является просто вопросом помещения другой строки-> функциональная запись в словаре (который живет в части кода, выделенного конфигурации.

  2. , Даже если у Вас есть только несколько записей, это "разделяет проблемы"; _setCurrentCurve ответственно за обеспечение электричеством во время выполнения, не определяя поле компонентов.

  3. Создают словарь и содержат на него.

  4. , Даже если это не используется в другом месте, Вы извлекаете вышеупомянутую пользу (locatability, пригодность для обслуживания).

Мое эмпирическое правило состоит в том, чтобы спросить, "Что продолжается здесь?" для каждого компонента моего кода. Если ответ имеет форму

... и ... и ...

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

2
ответ дан 30 November 2019 в 07:13
поделиться

Каждая из представленных опций соответствует хорошо некоторым сценариям:

  1. if-elif-else: простота, ясность
  2. словарь: полезный, когда Вы настраиваете его динамично (предполагают, что Вам нужна особая функциональность, которая будет выполняться на ответвлении)
  3. кортеж: простота, если еще случай для разнообразного выбора на ответвление.
  4. полиморфизм: автоматическое объектно-ориентированное ветвление
  5. и т.д.

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

./alex

1
ответ дан 30 November 2019 в 07:13
поделиться

Я соглашаюсь с df относительно второго примера. Первый пример я, вероятно, попытался бы переписать использование словаря, особенно если у всех конструкторов кривой есть та же подпись типа (возможно, использующий *args и/или ** kwargs). Что-то как

def _setCurrentCurve(self, new_curve):
    self.currentCurve = self.preset_curves[new_curve](options_here)

или возможно даже

def _setCurrentCurve(self, new_curve):
    self.currentCurve = self.preset_curves[new_curve](**preset_curve_defaults[new_curve])
1
ответ дан 30 November 2019 в 07:13
поделиться

В Python не делайте событие думает о том, как заменить оператор переключения.

классы Использования и полиморфизм вместо этого. Попытайтесь хранить информацию о каждом availble выборе и как реализовать его в одном месте (т.е. класс, который реализует его).

Иначе Вы закончите тем, что имели много мест, что каждый содержит крошечную часть каждого выбора, и обновление/расширение будет кошмаром обслуживания.

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

Думают о том, какие классы объектов Вы имеете и их свойства, затем создаете архитектуру OO вокруг них. Таким образом, Вы никогда не должны будете волноваться о недостающем операторе "переключателя" снова.

1
ответ дан 30 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: