执行多个函数,跟踪任何返回的tru

2024-06-08 20:21:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写从html表单获取数据并修改数据库对象的代码。我只想在数据库对象发生更改时执行put(),因此我需要知道是否有任何更改

到目前为止,我已经尝试了几种方法,我将在代码中加以说明。它们都使用以下设置代码:

def _addFormAttrToModel(self, obj, attr_name, new_attr):
    if hasattr(obj, attr_name):
        current_attr = getattr(obj, attr_name)
        if current_attr == new_attr:
            return False
    setattr(obj, attr_name, new_attr)
    return True
def addFormStringToModel(self, obj, attr_name):
    new_attr = self.request.get(attr_name, None)
    return self._addFormAttrToModel(obj, attr_name, new_attr)

第一种方法使用or确定是否有任何方法调用返回True

updated=False
updated = self.addFormStringToModel(customer, "name") or updated
updated = self.addFormStringToModel(customer, "addr") or updated
updated = self.addFormStringToModel(customer, "phone") or updated
if updated:
    customer.put()

我试验过的另一种形式使用一个集合:

results= set()
results.add( self.addFormStringToModel(customer, "name"))
results.add( self.addFormStringToModel(customer, "addr"))
results.add( self.addFormStringToModel(customer, "phone"))
if True in results:
    customer.put()

我真正想做的是这样的事情:

updated = self.addFormStringToModel(customer, "name") and \
          self.addFormStringToModel(customer, "addr") and \
          self.addFormStringToModel(customer, "phone")
if updated:
    customer.put()

但是,这会在更新的第一个属性之后停止执行。还有更像Python的方式吗


Tags: or方法代码nameselfobjnewreturn
2条回答

any与列表一起使用:

updated = [self.addFormStringToModel(customer, "name"),
          self.addFormStringToModel(customer, "addr"),
          self.addFormStringToModel(customer, "phone")]

if any(updated):

您可以通过列表将其缩短:

updated = [self.addFormStringToModel(customer, field)
           for field in ('name', 'addr' 'phone')]
if any(updated)

要删除冗余代码,应首先定义要检查的字段列表:

fields_to_check = ['name', 'addr', 'phone']

然后使用列表聚合将该方法应用于所有值:

updated = [self.addFormStringToModel(customer, field) for field in fields_to_check]

any()将告诉lis中的任何结果是否正确:

if any(updated):
    customer.put()

相关问题 更多 >