= Попробуйте, кроме шаблона? - PullRequest
3 голосов
/ 17 июля 2010

Я нахожу, что этот шаблон проектирования часто встречается:

try: year = int(request.GET['year'])
except: year = 0

Блок try может либо потерпеть неудачу, потому что ключ не существует, либо потому что это не int, но я неэто действительно не волнует.В конце концов мне просто нужно вменяемое значение.

Разве не должно быть лучшего способа сделать это?Или хотя бы способ сделать это в одну строку?Что-то вроде:

year = int(request.GET['year']) except 0

Или вы, ребята, тоже используете этот шаблон?


Прежде чем вы ответите, я уже знаю о request.GET.get('year',0), но вы все равно можете получить ошибку значения.Обтекание this в блоке try / catch для отлова ошибки значения означает, что значение по умолчанию дважды появляется в моем коде.Еще хуже ИМО.

Ответы [ 4 ]

10 голосов
/ 17 июля 2010

Вам, вероятно, лучше использовать get()

year = int(request.GET.get("year", 0))

Это установит год для того, что когда-либо запрашивалось. GET ['year'], или, если ключ не существует, онвернет 0. Это избавит вас от вашего KeyError, но вы все равно можете иметь ValueError из request.GET ['year'], если его нельзя преобразовать в int.

Относительно вашего вопроса (попробуйте / кроме), распространенная идиома в Python: EAFP .

РЕДАКТИРОВАТЬ:

Если вы действительно обеспокоены, почему бы не написать свойсобственный метод для этого:

def myGet(obj, key, type, defaultval):
    try:
        return type(obj.get(key, defaultval))
    except ValueError:
        return defaultval



# In your code
year = myGet(request.GET, 'year', int, 0)
6 голосов
/ 17 июля 2010

Разве не должно быть лучшего способа сделать это?

Там есть - он известен как "функция" ...:

def safeget(adict, key, type, default):
    try: return type(adict.get(key, default))
    except (ValueError, TypeError): return default

year = safeget(request.GET, 'year', int, 0)

FWIW, я не думаю, что когда-либо использовал этот «шаблон» - различные игнорируемые вами случаи ошибок, похоже, должны обрабатываться отдельно по причинам пользовательского интерфейса (отсутствует необязательное поле по умолчаниюхорошо, но если кто-то ошибочно набрал, скажем, 201o (ключи 0 и o закрыты, а в некоторых шрифтах их результаты выглядят похожими), как правило, нехорошо превращать свой ввод в0 Итак, я не думаю, что это так часто и не очень желательно, чтобы требовать что-то вроде специальной синтаксической формы в языке или даже встроенной функции.

Но хорошая вещь оВспомогательные функции, такие как safeget, заключаются в том, что мы с вами можем мирно согласиться не соглашаться с вопросами проектирования (может быть, мы просто привыкли делать разные виды программного обеспечения, например!), позволяя каждому из нас легко иметь именно такого помощника.ФУНКЦИИКаждый из них желает в своих личных «служебных» модулях! -)

5 голосов
/ 17 июля 2010

Я бы использовал вспомогательную функцию:

def get_int(request, name, default=0):
    try:
        val = int(request.GET[name])
    except (ValueError, KeyError):
        val = default
    return val

тогда:

year = get_int(request, 'year')

Он хранит сложность try / catch в одном месте и делает функции аккуратными, где у вас есть одна строка на параметр в ваших функциях просмотра.

2 голосов
/ 17 июля 2010

Нет способа сделать это в одну строку (о чем я могу думать), но я бы сделал это так, используя get():

try:
    year = int(request.GET.get("year", 0))
except ValueError:
    year = 0

Кроме того, обычно лучше пойматьконкретное исключение, а не все исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...