当前位置: 首页 > 科技观察

八种重构技巧,让Python代码更Pythonic

时间:2023-03-16 13:05:46 科技观察

1.合并嵌套的if语句让我们从简单的开始。不要嵌套这样的if语句,只需将它们组合成一个即可。ifa:ifb:pass#->refactorifaandb:pas2.在这里使用any而不是循环我们要检查列表中是否至少有一个正元素。更长的解决方案是遍历所有数字,检查当前数字,如果条件为真则中断。但是对于这个任务,Python中有一个专门的方法,即any函数。如果iterable的任何元素为真,则any返回真。这比手动循环要短得多,也更符合Python风格。numbers=[-1,-2,-4,0,3,-7]has_positives=Falseforninnumbers:如果n>0:has_positives=Truebreak#->refactorhas_positives=any(n>0forninnumbers)3.从for/while循环中提取语句很多时候你会看到在循环中定义了一个变量,但它永远不会改变。这些都是不必要的操作,所以把它拉出循环,然后你只需要创建一次。对于建筑物中的建筑物:city='London'addresses.append(building.street_address,city)#->refactorcity='London'对于建筑物中的建筑物:addresses.append(building.street_address,city)4.删除仅使用一次和立即返回的内联变量很多时候您会看到在最后一个函数中定义变量的代码,并且它在一行之后立即返回。如果你知道这个函数是干什么的,直接返回结果就行了。这样更简洁,避免了不必要的变量。然而,有时如果不是很清楚该函数在做什么,您可以给最后一个变量一个有意义的名称并将其用作自文档代码。defstate_attributes(self):"""返回状态属性。"""state_attr={ATTR_CODE_FORMAT:self.code_format,ATTR_CHANGED_BY:self.changed_by,}returnstate_attr#->refactordefstate_attributes(self):"""返回状态attributes."""return{ATTR_CODE_FORMAT:self.code_format,ATTR_CHANGED_BY:self.changed_by,}5.将if语句替换为if表达式您可以使用if表达式代替ifelse语句来设置变量的值像这样在一行上的表达式将其设置为.不过,这种重构技术有些值得商榷。有些人仍然喜欢第一个选项,这很好。ifcondition:x=1else:x=2#->refactorx=1ifconditionelse26.添加警告声明查看这段代码时,很难快速掌握发生了什么。有多个if-else语句和多个缩进。仔细一看,你可能会发现第一个if语句几乎涵盖了整个函数代码,只是在最后我们有相应的else子句,我们只是返回False。我们可以将这个else子句移到最开始。这也称为警告声明。所以如果条件不成立,我们就不会执行其余的函数代码。这删除了??else子句,现在整个代码的缩进级别减少了一级。这看起来更清晰,更容易理解。defshould_i_wear_this_hat(self,hat):ifisinstance(hat,Hat):current_fashion=get_fashion()weather_outside=self.look_out_of_window()is_stylish=self.evaluate_style(hat,current_fashion)如果weather_outside。is_raining:print("Damn)returnTrueelse:print("Great.")returnis_stylishelse:returnFalse#->refactordefshould_i_wear_this_hat(self,hat):如果不是isinstance(hat,Hat):returnFalsecurrent_fashion=get_fashion()weather_outside=self.wind_out_of_)is_stylish=self.evaluate_style(hat,current_fashion)ifweather_outside.is_raining:print("Damn.")returnTrueelse:print("Great.")returnis_stylish7.将作业移近使用位置这是对前面示例代码的改进,但是仍然需要一些时间来理解这里发生了什么。所以我们要检查是否应该戴帽子。逻辑是这样的:如果下雨,我们总是说True,如果没有下雨,如果帽子很时髦,我们就说True。我们可以大大提高此逻辑的可读性的一种简单方法是将分配移至更接近其使用的位置。我们需要在使用之前知道天气状况如果声明。现在fashion和style变量只在else子句中需要,所以将它们向下移动。现在应该更清楚发生了什么。在第4项的前面,我们可以进一步缩短代码并立即返回评估的样式结果。在这个例子中,is_stylish是一个更好的名字,因为它告诉你,如果帽子很时尚,你就说True,否则就说False。因此,只需将冗余变量保留在这里即可。defshould_i_wear_this_hat(self,hat):如果不是isinstance(hat,Hat):返回FalsereturnTrueelse:print("Great.")returnis_stylish#->refactordefshould_i_wear_this_hat(self,hat):如果不是isinstance(hat,Hat):returnFalseweather_outside=self.look_out_of_window()ifweather_outside.is_raining:print("该死的。”)returnTrueelse:print("Great.")current_fashion=get_fashion()returnself.evaluate_style(hat,current_fashion)#is_stylish=self.evaluate_style(hat,current_fashion)#returnis_stylish8.简化的序列检查这是我经常看到的另一件事。当你需要检查集合中是否有元素时,例如在列表中,你不需要写iflen(your_list)>0。你可以简单地说ifyour_list.这是pep8推荐的方法,也称为真值测试。这是可能的,因为在Python中,空序列和集合的计算结果为False。所以这可以应用于字符串、元组、列表、字典和集合。如果len(list_of_hats)>0:hat_to_wear=choose_hat(list_of_hats)#->refactoriflist_of_hats:hat_to_wear=choose_hat(list_of_hats)