【问题标题】:pep8 compliance with long json dictionary lookup?pep8 是否符合长 json 字典查找?
【发布时间】:2016-06-23 00:32:53
【问题描述】:

使用 79 的字符长度,有人会如何制定一个命令,例如:

return method_returning_json()['LongFieldGroup1']['FieldGroup2']['FieldGroup3']['LongValue']

如果我将查找移到下一行,例如:

return method_returning_json()\
    ['FieldGroup1']['FieldGroup2']['FieldGroup3']['Value']

pep8 抱怨“[ 之前的空格”,因为有几个选项卡。但是,如果我将第二个/第三个/etc 组移动到换行符,它会做同样的事情。

我知道我可以将# noqa 标签添加到行尾,但我希望有更好的方法。

【问题讨论】:

  • 您可能希望中断对中间变量的查找(例如,o1 = method_returning_json()['FieldGroup1']o2 = o1['FieldGroup2']['FieldGroup3']['Value'])。如果o1o2 可以具有有意义的名称并充当数据的注释,则效果最佳。除此之外,你无能为力。
  • 我也不会痴迷于 PEP8。这是一个很好的指导方针,我很高兴大多数 Python 开发人员大部分时间都遵循它,但是 IMO 你在方法调用后用反斜杠建议的版本是非常可读的,只要没有 too 许多['groups']['of']['square']['brackets']。 IMO pep8 工具抱怨不一定足以更改您的代码。如果它确实提高了可读性,请灵活一点。
  • 在标准库本身和文档字符串之外,我认为大多数人认为大约 100 个字符的行长是合理的。也就是说,无论您选择的阈值如何,都应该尝试驯服极端异常值。

标签: python json python-2.7 pep8


【解决方案1】:

使用出现在括号内的隐式续行:

return (method_returning_json()
          ['LongFieldGroup1']
          ['FieldGroup2']
          ['FieldGroup3']
          ['LongValue'])

(您可能需要调整实际缩进以使pep8 工具满意。)

您甚至可以使用索引括号本身来允许隐式行继续,尽管我并没有发现任何特别可读的变体。

# Legal, but probably not desirable.
# At the very least, pick one style and be consistent; don't
# use a variety of options like I show here.
return method_returning_json()[
         'LongFieldGroup1'][
         'FieldGroup2'][
         'FieldGroup3'
         ][
         'LongValue'
         ]

【讨论】:

    【解决方案2】:

    引用PEP8:

    愚蠢的一致性是小聪明的妖精

    Guido 的一个重要见解是,阅读代码的频率远高于编写代码的频率。此处提供的指南旨在提高代码的可读性并使其在广泛的 Python 代码中保持一致。正如 PEP 20 所说,“可读性很重要”。

    风格指南是关于一致性的。与本风格指南保持一致很重要。项目内部的一致性更为重要。一个模块或功能内的一致性是最重要的。

    但是,要知道什么时候不一致 - 有时样式指南建议不适用。如有疑问,请使用您的最佳判断。查看其他示例并决定什么看起来最好。不要犹豫,问!

    特别是:不要为了遵守本 PEP 而破坏向后兼容性!

    忽略特定准则的其他一些充分理由:

    如果应用该指南会降低代码的可读性,即使对于习惯阅读遵循此 PEP 的代码的人也是如此。

    为了与也破坏它的周围代码保持一致(可能是出于历史原因)——尽管这也是清理别人的烂摊子的机会(在真正的 XP 风格中)。

    因为有问题的代码早于指南的引入,并且没有其他理由修改该代码。

    当代码需要与不支持样式指南推荐的功能的旧版 Python 保持兼容时。

    在我看来(这只是一种观点),有时像你这样的断行会使代码更难阅读,因此这可能是忽略行长指南的合理时机。

    话虽如此,如果您真的想将行长保持在 79 以下,则 方法可能是将命令实际拆分为单独的行:

    some_json = method_returning_json()
    key1 = 'FieldGroup1'
    key2 = 'FieldGroup2'
    key3 = 'FieldGroup3'
    return some_json[key1][key2][key3]['Value']
    

    这不像单行方法那样简洁,但每一行都更短。哪个是较小的恶由你判断。

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2014-11-14
      • 2016-10-02
      • 2010-12-24
      • 2020-07-25
      • 2011-02-01
      • 2011-07-21
      • 2019-12-01
      相关资源
      最近更新 更多