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)
难道不应该有更好的方法吗?
还有就是 -它被称为"功能" ...:
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(关键0和o键被关闭,在某些字体中,它们的结果看起来很相似),一般来说,默默地将输入转换为不好看0.所以,我不认为它是如此频繁,也不是很明智,保证语言中的特殊语法形式,甚至是内置函数.
但是关于辅助函数的好处safeget是,你和我可以和平地同意在所涉及的设计问题上不同意(例如,我们可能只是习惯于使用不同类型的软件! - )同时让我们每个人都能轻松拥有每个人都希望在他们的个人"实用程序"模块中使用辅助函数! - )
我使用辅助函数:
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的复杂性保留在一个地方,并且可以实现整洁的功能,在视图函数中每个参数有一行.
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |