=尝试除了模式?

时间:2010-07-17 01:45:37

标签: python design-patterns

我发现这种设计模式出现了很多:

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

try块可能因为密钥不存在而失败,或者因为它不是int,但我并不在意。我最终只需要一个理智的价值。

不应该有更好的方法吗?或者至少在一条线上做到这一点?类似的东西:

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

或者你们也使用这种模式吗?


在您回答之前,我已经了解request.GET.get('year',0),但您仍然可以获得值错误。在try / catch块中包装 this 以捕获值错误只是意味着默认值在我的代码中出现两次。更糟糕的IMO。

4 个答案:

答案 0 :(得分:10)

您最好使用get()

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

这会将year设置为request.GET ['year'],或者如果该键不存在,它将返回0.这消除了你的KeyError,但你仍然可以从请求中得到一个ValueError .GET ['year'],如果它不能转换为int。

关于你的问题(try / except),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)

答案 1 :(得分:6)

  

不应该有更好的方法   此?

- 它被称为“功能”......:

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,我不认为我曾经使用过这种“模式” - 你忽略的各种错误案例似乎应该因为UI原因而单独处理(缺少可选字段默认是好的,但如果有人错误地打字,比如,201o0o键被关闭,而且在某些字体中,它们的结果看起来很相似),一般来说,默默地转动它们似乎并不好输入0。因此,我认为保证语言中的特殊语法形式,甚至是内置函数都不是那么频繁,也不是很明智。

但像safeget这样的辅助函数的优点在于你和我可以和平地同意在所涉及的设计问题上存在分歧(例如,我们可能习惯于使用不同类型的软件! - )同时让我们每个人轻松拥有他们个人“实用程序”模块中每个人所需的辅助功能! - )

答案 2 :(得分:5)

我使用辅助函数:

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的复杂性保存在一个地方,并且可以实现整洁的功能,在视图函数中每个参数都有一行。

答案 3 :(得分:2)

无法在一行(我能想到)中这样做,但我会这样做,使用get()

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

此外,捕获特定异常通常更好,而不是所有异常。