如何编写符合79字符限制的Pythonic风格可行走法代码?
既Pythonic又符合行宽限制的优化写法
嘿,我太懂这种被79字符行宽限制卡得头疼的感觉了!你已经尝试了几种思路,其实只差一点点就能找到完美平衡——既保留Python的简洁风格,又不违反行宽规则。咱们来拆解一下你的问题,再给出几个更优的方案:
先聊聊你现有版本的小问题
- 版本1:确实太长,可读性差,拆分是必须的;
- 版本2:用反斜杠换行虽然可行,但Python官方更推荐用括号包裹多行表达式,反斜杠容易漏写或者后续修改时出错;
- 版本3:缩写变量能缩短长度,但核心的列表推导和条件判断挤在一起,还是容易超宽;
- 版本4:逻辑清晰但不够Pythonic,明明可以用列表推导简化的循环,没必要写成C++风格的逐行
append。
几个更优的写法推荐
方案1:用括号包裹多行表达式(最推荐)
利用Python允许括号内随意换行的特性,把返回的条件表达式和列表推导拆分成多行,既符合PEP8,又保持Pythonic:
def list_of_possible_moves(self): # 版本5:兼顾风格与行宽 return ( [] if self._state != Game.play else [ index for index, square in enumerate(self._board) if square == TicTacToe.square_free ] )
每一行都控制在79字符内,而且结构清晰,一眼就能看明白逻辑。
方案2:拆分条件判断+多行列表推导
把条件判断单独提出来,再拆分列表推导的行,比版本4更简洁,同时满足行宽:
def list_of_possible_moves(self): # 版本6:简洁清晰 if self._state != Game.play: return [] return [ index for index, square in enumerate(self._board) if square == TicTacToe.square_free ]
这种写法逻辑分层明显,列表推导的拆分也完全符合PEP8规范,可读性拉满。
方案3:提取常量/简化判断条件
如果TicTacToe.square_free这个常量名太长,可以提前赋值给短变量,进一步缩短每行长度:
def list_of_possible_moves(self): # 版本7:简化长常量 if self._state != Game.play: return [] free_square = TicTacToe.square_free return [ index for index, square in enumerate(self._board) if square == free_square ]
或者用一个简单的lambda函数封装判断逻辑,让列表推导更简洁:
def list_of_possible_moves(self): # 版本7变体 if self._state != Game.play: return [] is_free = lambda s: s == TicTacToe.square_free return [index for index, square in enumerate(self._board) if is_free(square)]
总结一下
Python里写多行代码时,优先用括号包裹代替反斜杠;列表推导完全可以拆分成多行,这是符合PEP8的;遇到长常量或重复判断时,提前提取成变量能有效缩短行宽。这样既能摆脱C++风格的冗余写法,又能严格遵守行宽限制~
内容的提问来源于stack exchange,提问作者Alex Lopatin
相关产品推荐
相关产品推荐

