2012-07-23 52 views
0

web2py example 33我们看到:我怎样才能使这个代码更DRY

db.purchase.insert(buyer_id=form.vars.buyer_id, 
    product_id=form.vars.product_id, 
    quantity=form.vars.quantity) 

,但我认为应该有一些办法,使之少重复。也许这个?

db.purchase.insert(**dict([k = getattr(form.vars, k) for k in "buyer_id product_id quantity".split()])) 
+2

这是如何重复? ...第一个例子是更Python,我认为(简单) – 2012-07-23 18:24:42

+0

你可以通过一个字典为'插入()',你可以通过类型的字典列表'bulk_insert()',你可以使用'_filter_fields'筛选字典 – 2012-07-23 18:32:06

回答

2

你可能避免重蹈form.vars

vars = form.vars 
db.purchase.insert(
    buyer_id=vars.buyer_id, 
    product_id=vars.product_id, 
    quantity=vars.quantity) 

还有一些重复,但我认为这是更好一些的重复,而不是使你的代码难以阅读离开它。

6

对我来说,DRY装置1)不重复实际的代码,以及2)(和更重要)不重复的信息;即每个信息存在的地方应该有一个地方。

在这种情况下,你真的只是重复一个模式,我觉得这很好。第二个例子更难以阅读;为什么只是为了节省一些字符而复杂化呢?

0

如果这些三件事情都是有你可以做

db.purchase.insert(** form.vars)

否则我认为原来的代码是大量的干

但我想你可以做

to_insert = {"product_id":form.vars.product_id,"quantity":form.vars.quantity,"buyer_id":form.vars.buyer_id} 
db.purchase.insert(**to_insert) 

这类似于你的第二个例子,但更具可读性和简单的(有些蟒蛇的原则)

+0

'** form.vars'不起作用。 '** kwargs'语法适用于字典,而不是对象属性名称。 – kojiro 2012-07-23 18:38:24

+0

哦,你是绝对正确的...我的坏..不知道我在想什么(反正...现在修复) – 2012-07-23 18:44:00

相关问题