Python 三元风格:这是好是坏的风格



下面的行实际上像句子一样可读。这样做似乎也很Pythonic,但同样,我对这种语言很了解,只是在寻找风格技巧。

for state in states: score += penalty if state == bad else bonus

这种风格不适合我的工作场所。考虑 PEP8 中的以下代码片段:

复合语句(同一行上的多个语句)是一般不气馁。

是的:

if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()

而不是:

if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()

因此,在您的情况下:

坏:

for state in states: score += penalty if state == bad else bonus

更好:

for state in states:
    score += penalty if state == bad else bonus

最好:

for state in states:
    if state == bad:
        score += penalty
    else:
        score += bonus

作为设计风格的问题,不一定是编码风格,我宁愿看到特定于状态的分数增量存储在映射对象中,如下所示:

for state in states:
    score += scores_per_state[state]
您可以使用

sum

score += sum(penalty if state == bad else bonus
             for state in states)

正如 Rob 所说,你真的应该参考 Python 的 PEP 标准。 有一个庞大的社区致力于定义在 Python 中编码风格时什么是可以的,什么是不可以的......

python.org/dev/peps/pep-0008

我建议从那里开始。

我对上面的建议,尽管非常简洁和紧凑,但代码最终必须维护。 在你编码的时候,总是假设必须维护你的代码的人将是一个疯狂的斧头杀人犯,他知道你住在哪里。

将行拆分为每行可读行一个操作或函数。 没有人在乎你的代码有多花哨,如果维护起来很痛苦。

IMO,这是糟糕的风格。在"专业环境"中编码的第一个原则是"其他人可以维护我的代码吗?

首先,它违反了 PEP8 中关于在一行上排列代码的几个准则。

其次,它以一种类似于理解的方式组合代码,而不是一个。这是不必要的混乱。

最后,python中的三元风格本质上是倒退的。与其他语言不同,它使用值/条件/值,而不是条件/值/值。除非该表示与代码的实际条件匹配(例如,提供默认值),否则应使用以正确顺序表达要传达的内容的结构:

for state in states:
    if state == bad:
        score += penalty
    else:
        score += bonus

if/else 语句的方向可能会颠倒(state != bad),这取决于代码中涉及多少类型或其他费用。但除此之外,请记住,您正试图让某人(可能是您)在大约 5 年后"修复这个旧废话"的生活更轻松。

相关内容

  • 没有找到相关文章

最新更新