Python中的行延续赋值

17

当变量嵌套多层、变量名较长且被赋予的值/表达式也较长时,对于变量赋值的首选风格是什么?

例如:

if this:
    if that:
        if here:
            if there:
                 big_variable['big_key']['big_value'] = another_big_variable_that_pushes_line_over_79_characters
                 other_thing = something

字符限制违规只有个位数,但我希望清理我的代码,使其尽可能忠实地遵循PEP 8。我已经做了以下几点,但我对Python还比较新,不确定这是否会让有经验的Python程序员感到不适:

if this:
    if that:
        if here:
            if there:
                big_variable['big_key']['big_value'] = \
                    another_big_variable_that_pushes_line_over_79_characters
                other_thing = something

我觉得换行符有点让人忌讳;但是如果我在使用这些大词典并且无法在变量名称的中间进行干净的分割,我想不出比我现在拥有的更清晰的解决方案。


1
有时候,与其费力地寻找执行某些操作的惯例,完全避免被迫采用惯例可能更好,方法是消除问题的根源。话虽如此,如果可以知道,为什么变量名首先要“相当长”呢?此外,“相当长的值/表达式”是可以接受的……除非您在每个表达式中都重复了相当数量的代码。 - WGS
一个超过79个字符的变量名非常可疑。它实际上是某种表达式吗? - Gort the Robot
变量名本身并不是79个字符,而是20或30个字符;它只是将行数推到了79。@Nanashi 变量名很长是因为我在使用Flask和Google协议缓冲区,其中我无法控制消息或属性名称。在Flask中,我使用“session”对象,并将协议缓冲区消息返回的值映射到会话中的键,这也可能非常长。如果我花一些时间处理它,我肯定可以缩短这些名称;我只是想知道我的简单解决方案是否会对有经验的Python开发人员造成冒犯。 - SheffDoinWork
1
别担心,这完全没有冒犯的意思。用 Flask 工作可以更好地理解这个问题了。你所谓的“廉价”修复其实并不便宜,如果能解决问题那就行了。我们可能将来会遇到的问题不是变量名的重复,而是修复方法本身的重复。正如被接受的答案指出的那样,这可能是一种代码气味(code smell),并不总是技术错误,而很可能是设计缺陷。话虽如此,试着在你的端上测试一下吧。如果你发现自己有了“命名疲劳”,那么也许是时候寻找更好的解决方案了。祝你好运! - WGS
在这种情况下,将你的代码提交到 Code Review SE 上,看着它被改进并重生。我曾经在那里询问过一次关于我的数字转换应用程序的改进,结果得到了一个用户的大量评论,几乎让我的简单应用程序达到了生产级别。尽管它很简单,但它是我现在正在为我女儿使用的 Kivy 应用程序的支柱。你会从中受益匪浅的。 :) - WGS
显示剩余2条评论
2个回答

26

我认为在Python中使用行续行没有任何问题。但有时我更喜欢这种方式:

big_variable['big_key']['big_value'] =(
    another_big_variable_that_pushes_line_over_79_characters
)

它在长表达式中也很有用。


3
实际上,这正是PEP 8建议采取的方式:“包装长行的首选方式是使用Python括号、方括号和花括号内置的隐式行连接。可以通过将表达式放在括号中来将长行分成多行。应优先使用这种方法,而不是使用反斜杠进行行连接。”但请注意,在赋值运算符“=(”两侧都应有空格:= (而不是=( - ruakh

9

换行符有些禁忌,但并非世界末日。我们必须始终努力编写代码,以便后来的其他程序员能够理解我们在做什么。

使用换行符字符\是实现可读性目标的武器之一。

命名约定是另一个问题。正如达芬奇所说:“简单才是最高的复杂”。如果你可以将变量名称简短且易于理解,那么你就很精致。;-) 。只是说var1、var2、var3等太容易了。想出好的名称需要投入努力。

你更愿意看到一个名为ChiefExecutiveOfficerOfCompanysName还是CEOName的变量?

如果你可以结合if语句,那么你的代码就可以变得更加易读。如果你有一些大的if...else-if层次结构,那么很可能你正在做一些错误的事情(这是一种代码异味)。例如,你可能会改变这个:

if this:
    if that:
        if here:
            if there:

变成这样:

if this and that and here and there:

或者将这样的粗略逻辑投入到一个评估函数中,如下所示:

if EvaluateConditions(<args>):

将代码分解为逻辑部分并将这些部分放入函数中是提高可读性的另一种方法(我们只有有限的RAM,希望能够将整个函数放入其中...人类不擅长换页)。
通过使用参数化函数或一些良好的设计模式,避免复制和粘贴具有轻微变化的代码。设计 模式

+1:我也是这么想的。Python非常优秀,让你可以逃避很多问题,但是易用性不应该滥用到接近无意义的难以理解程度。 - WGS
谢谢!if层次结构显然不是这么傻的,我遇到的主要问题是变量名本身,正如我在上面的评论中所述,我真的无法控制。我只是好奇我的解决方案是否是一个不需要太多麻烦就可以使用的东西,还是我应该非常警惕它。 - SheffDoinWork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接