=尝试除了模式?

mpe*_*pen 3 python design-patterns

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

try: year = int(request.GET['year'])
except: year = 0
Run Code Online (Sandbox Code Playgroud)

try块可能因为密钥不存在而失败,或者因为它不是int,但我并不在乎.我到底需要一个理智的价值.

难道不应该有更好的方法吗?或者至少在一条线上做到这一点?就像是:

year = int(request.GET['year']) except 0
Run Code Online (Sandbox Code Playgroud)

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


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

Nic*_*sta 10

你最好还是可以使用 get()

year = int(request.GET.get("year", 0))
Run Code Online (Sandbox Code Playgroud)

这将把year设置为request.GET ['year'],或者如果键不存在,它将返回0.这消除了你的KeyError,但你可能仍然有来自request.GET的ValueError [ '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)
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 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)
Run Code Online (Sandbox Code Playgroud)

FWIW,我不认为我曾经使用过这种"模式" - 你忽略的各种错误案例似乎应该因为UI原因而单独处理(缺少可选字段默认是好的,但是如果有人错误输入的话)比方说,201o(关键0o键被关闭,在某些字体中,它们的结果看起来很相似),一般来说,默默地将输入转换为不好看0.所以,我不认为它是如此频繁,也不是很明智,保证语言中的特殊语法形式,甚至是内置函数.

但是关于辅助函数的好处safeget是,你和我可以和平地同意在所涉及的设计问题上不同意(例如,我们可能只是习惯于使用不同类型的软件! - )同时让我们每个人都能轻松拥有每个人都希望在他们的个人"实用程序"模块中使用辅助函数! - )


Ned*_*der 5

我使用辅助函数:

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

然后:

year = get_int(request, 'year')
Run Code Online (Sandbox Code Playgroud)

它将try/catch的复杂性保留在一个地方,并且可以实现整洁的功能,在视图函数中每个参数有一行.