2015-08-26 28 views
1

所以我做了这个方法来设置从一个文本文件中的参数:添加多个元素在字典列出

def set_params(self, params, previous_response=None): 
     if len(params) > 0: 
      param_value_list = params.split('&') 
      self.params = { 
       param_value.split()[0]: json.loads(previous_response.decode())[param_value.split()[1]] if 
       param_value.split()[0] == 'o' and previous_response else param_value.split()[1] 
       for param_value in param_value_list 
      } 

当我把这种方法,例如像这样:

apiRequest.set_params("lim 5 & status active") 

//now self.params={"lim" : 5, "status" : "active"} 

它运作良好。现在,我希望能够以相同的参数多次添加,而当这种情况发生,设置帕拉姆像一个列表:

apiRequest.set_params("lim 5 & status active & status = other") 

//I want this: self.params={"lim" : 5, "status" : ["active", "other"]} 

我怎么能漂亮修改此方法?所有我能想到的都是有点丑陋的......我是新来的蟒蛇

+1

堆栈溢出可能不适合这类问题的最佳场所。也许你可以发布到http://codereview.stackexchange.com/代替? – georgebrock

+0

从常规循环开始,过于复杂的理解表达式很少美丽。 – bereal

+1

可读性...例如'param_value.split()',它会出现4次。为什么不先用'split'做预处理步骤? –

回答

1

只是写得尽可能简单和直接。这通常是最好的方法。在我的代码中,下面我对你的需求做了一些改变:所有的值都是一个列表,有些可能只有一个元素在列表中。

在这种方法我采用下列选项和技术:

  • 解码和分析先前的反应只有一次,而不是引用它有一个空的字典
  • 分割每个字符串
  • 每次启动只有一次:这是因为它避免了冗余操作和内存分配,并且(更重要的是)因为代码不重复而更易于阅读,所以速度更快。
  • 根据特殊情况调整value
  • 使用setdefault(),以获得值的当前列表中,如果存在的话,或设置新的空列表对象,如果它不存在
  • 新值追加到的值的列表
def set_params(self, params, previous_response=None): 
    if len(params) <= 0: 
     return 
    previous_data = json.loads(previous_response.decode()) 
    self.params = {} 
    for param_value in params.split('&'): 
     key, value = param_value.split() 
     if key == 'o' and previous_response: 
      value = previous_data[value] 

     values = self.params.setdefault(key, []) 
     values.append(value) 
# end set_params() 

调试比首先编写代码困难一倍。 因此,如果您尽可能巧妙地编写代码,您可以通过定义 来调试它。

— Brian W. Kernighan and P. J. Plauger in The Elements of Programming Style. 

参考:http://quotes.cat-v.org/programming/