Выбор 1:
def f1(c):
d = {
"USA": "N.Y.",
"China": "Shanghai"
}
if c in d:
return d[c]
return "N/A"
Выбор 2:
def f2(c):
d = {
"USA": "N.Y.",
"China": "Shanghai"
}
try:
return d[c]
except:
return "N/A"
Так, чтобы я мог тогда звонить:
for c in ("China", "Japan"):
for f in (f1, f2):
print "%s => %s" % (c, f(c))
Варианты состоят в том, чтобы или определить, является ли ключ в справочнике перед рукой (f1), или просто отступление к исключению (f2). Какой предпочтен? Почему?
Похоже, вы хотите использовать MVC и другие шаблоны, потому что они являются новыми модульными словами. Разделение вашего дизайна среди просмотра и контроллера модели должна сообщить вам, как распространить функциональность вашего приложения. Хотя я полностью согласен с тем, что использование MVC является правильным подходом, я предлагаю исследовать шаблон и посмотреть на какой-то исходный код, который реализует его. В качестве начала к вашему вопросу, хотя виджеты, которые будут отображаться, будут вашими взглядами, что многое должно быть очевидно. Вход от пользователя, например, изменение параметра какого-либо виджета или запрашивания другой информации, приступит к вашему приложению и должен обрабатываться контроллером. Бетонный пример этого - это на основе Java HttPServlet. Сервер контроллера получает запрос пользователя и запрашивает более низкие слои вашего приложения (услуги, настойчивость и т. Д.) для обновленного представления вашей модели. Модель включает в себя все ваши доменные объекты (я данных из ваших баз данных и т. Д.). Эти данные (обновленная модель) возвращается к контроллеру, что, в свою очередь, толкает новый вид для пользователя. Надеемся, что этого достаточно, чтобы вы начали разработать ваше приложение.
Как и дальше помощи, вы можете рассмотреть возможность использования структуры для оказания помощи в разработке вашего приложения. Мне очень нравится весна, и у него есть первый класс реализации MVC, который действительно помогает вам разработать правильное веб-приложение MVC.
-121--3375377-Как правило, исключения несут некоторые накладные расходы и предназначены для по-настоящему «исключительных» случаях. В этом случае это звучит как нормальная часть выполнения, а не «исключительная или« ошибка »состояния.
В целом, я думаю, что ваш код выиграет, используя конвенцию «IF / Enter», и сохранение исключений только в том случае, если они действительно нужны.
Также я бы пошел на
def f2(c):
d = {
"USA": "N.Y.",
"China": "Shanghai"
}
return d.get(c, "N/A")
, этот путь короче и «Get» предназначен для работы.
Также, кроме без явного исключения плохой правя, поэтому используйте , кроме KeyError:
не только кроме.
Исключения не имеют большого количества накладных расходов в Python. Как правило, лучше использовать их, если нет лучших альтернатив или иногда даже если он сохраняет поиск атрибута (в использовании вместо HASATTR).
Отредактируйте: , чтобы очистить общую точку об исключении.
Paxdiablo правильно на общем моменте. Python в основном предназначен для «его проще, чтобы задать забыть, а затем разрешение», то есть попробуйте потом посмотреть, что не удается (исключения), то «смотреть, прежде чем прыгать», посмотрите, что там, а затем поступают. Это потому, что поиск атрибута в Python может быть дорогим, поэтому снова звонит одни и те же вещи (чтобы проверить границы) - это пустая трата ресурсов. Тем не менее, внутренние вещи в Python обычно получали более приятные помощники, так что лучше их использовать.
В целом (не обязательно Python) я предпочитаю во всех но самые простые случаи. Это связано с тем, что в многопоточных средах или во время доступа к базе данных базовые данные могут изменяться между проверкой ключа и извлечением значения.
Если вы не изменяете ассоциативный массив вне текущего потока, вы можете использовать метод «сначала проверка, затем извлечение».
Но это для общего случая. Здесь, в частности, вы можете использовать метод get
, который позволяет вам указать значение по умолчанию, если ключ не существует:
return d.get (c, "N/A")
Я поясню то, что я сказал в первом абзаце. В ситуациях, когда базовые данные могут изменяться между проверкой и использованием, вы должны всегда использовать операцию типа исключения (если только у вас нет операции, которая не вызовет проблемы, например d.get ( )
, упомянутое выше). Рассмотрим, например, следующие две временные шкалы потоков:
+------------------------------+--------------------+
| Thread1 | Thread2 |
+------------------------------+--------------------+
| Check is NY exists as a key. | |
| | Delete NY key/val. |
| Extract value for NY. | |
+------------------------------+--------------------+
Когда поток 1 пытается извлечь значение, он все равно получит исключение, поэтому вы можете просто указать возможность и удалить начальную проверку.
Комментарий о базах данных также актуален, поскольку это еще одна ситуация, когда базовые данные могут измениться. Вот почему я предпочитаю атомарный SQL (где это возможно), а не что-то вроде получения списка ключей, а затем их обработки отдельными операторами.
Я с Дэвидом на этом:
def f2(c):
d = {
"USA": "N.Y.",
"China": "Shanghai"
}
return d.get(c, "N/A")
... это именно то, как я бы написал.
Для решения ваших других вариантов:
в «F1 ()», в этом нет ничего плохого в этом, как SE, но словари имеют метод GET () для почти значительного использования случая использования: «Получите это из дикта И если это не там, верните это другое вместо этого. Это все ваш код, говорит, используя GET () просто более лаконично.
В «F2 ()», используя «кроме сама по себе, как это нахмурится», и, кроме того, вы на самом деле не делаете ничего полезного в ответ на исключение - в вашем случае вызывающий код никогда не узнает Было исключение. Так зачем использовать конструкцию, если он не добавляет значение вашей функции или код, который его называет?
Я вижу людей, использующих «GET», которые я рекомендую. Однако, если вы окажетесь в аналогичной ситуации в будущем, поймайте исключение, вы имеете в виду:
try:
return d[k]
except KeyError:
return "N/A"
таким образом, другие исключения (в том числе Keyboardintrupt
) не поймают. Вы почти никогда не хотите поймать Keyboardintrupt
.
Как только я спросил об этом, я понял, что тип данных не является объектом.
Делая его объектом типа (его поступление через конвертер типов в Silverlight) и он работал.
-121--3518774-Как насчет этого:
byte[] array = new byte[arrayLength];
if (array is byte[])
{
// Your code
}
-121--3518773- Я согласен, что в данном случае dict.get является лучшим решением.
В целом, я думаю, что ваш выбор будет зависеть от того, насколько вероятны исключения. Если вы ожидаете, что поиск ключа в основном пройдет, то try/catch является лучшим выбором IMO. Точно так же, если они будут часто проваляться, лучше заявление «если».
В Python производительность поиска исключений и атрибутов не так сильно отличается, поэтому я бы больше беспокоился о логике использования исключений/предварительного просмотра, чем об аспектах производительности.