用于列表、字典等的 Python“最佳格式化实践”

Posted

技术标签:

【中文标题】用于列表、字典等的 Python“最佳格式化实践”【英文标题】:Python "best formatting practice" for lists, dictionary, etc 【发布时间】:2011-04-28 11:39:39 【问题描述】:

我一直在查看 Python 文档以了解大型列表和字典的代码格式化最佳实践,例如,

something = 'foo' : 'bar', 'foo2' : 'bar2', 'foo3' : 'bar3'..... 200 chars wide, etc..

something = 'foo' : 'bar',
             'foo2' : 'bar2',
             'foo3' : 'bar3',
             ...
             

something = 
             'foo' : 'bar',
             'foo2' : 'bar2',
             'foo3' : 'bar3',
             ...
             

如何处理列表/字典的深度嵌套?

【问题讨论】:

【参考方案1】:

我的首选方式是:

something = 'foo': 'bar',
             'foo2': 'bar2',
             'foo3': 'bar3',
             ...
             'fooN': 'barN'

【讨论】:

对 git 不太友好,因为在第一行或最后一行更改键/值会将其他语法元素拉入变更集中。 嵌套字典怎么样?【参考方案2】:

aaronasterling 的缩进风格是我喜欢的。 another SO Question 中解释了这种风格以及其他几种风格。尤其是 Lennart Regebro 的回答给出了很好的概述。

但这种风格是投票最多的风格:

my_dictionary = 
    1: 'something',
    2: 'some other thing',

【讨论】:

我特别喜欢 python 允许您使用逗号跟随字典、列表或元组的最后一项。这使得以后重新排序或扩展序列变得更容易。 @AndrewF 我必须同意。这是 JSON 唯一让我生气的事情之一,因为它拒绝处理序列中的尾随逗号。 一定是 C/Java 程序员对此投票,因为他们看到了一些熟悉的东西。【参考方案3】:

根据PEP8 style guide有两种方式来格式化字典:

mydict = 
    'key': 'value',
    'key': 'value',
    ...
    

mydict = 
    'key': 'value',
    'key': 'value',
    ...

如果你想符合 PEP8,我会说其他任何技术上都是错误的。

【讨论】:

【参考方案4】:

以任何你想要的方式定义你的字典,然后试试这个:

from pprint import pprint

pprint(yourDict)

# for a short dictionary it returns:

'foo': 'bar', 'foo2': 'bar2', 'foo3': 'bar3'

# for a longer/nested:

'a00': 'b00': 0,
         'b01': 1,
         'b02': 2,
         'b03': 3,
         'b04': 4,
         'b05': 5,
         'b06': 6,
         'b07': 7,
         'b08': 8,
         'b09': 9,
 'a01': 1,
 'a02': 2,
 'a03': 3,
 'a04': 4,
 'a05': 5,
 'a06': 6,
 'a07': 7,
 'a08': 8,
 'a09': 9,
 'a10': 10

你喜欢这个输出吗?

【讨论】:

OP 不想知道如何打印,而是想知道如何在源代码中格式化。 @aaronasterling - 当然。这可以告诉他如何在他的源代码中格式化给定的结构。 那么 pprint 是如何打印出来的呢?第二还是第三? @Ashish - 第一个是短结构,第二个是长结构 是的,因为pprint 在标准库中,它提供了一个更可取的样式,根据Zen of Python 的座右铭“应该有一个--最好只有一个--显而易见的方法。”【参考方案5】:

如果您使用ganeti(尊重 PEP 8),您应该选择第三个选项。

something = 
             'foo1': 'bar1',
             'foo2': 'bar2',
             'foo3': 'bar3',
             ...
             

我特别喜欢这个。因为你可以只选择你想要的元素。而且我觉得这样在两端删除或添加元素会更快。

注意:正如评论中指出的那样,根据 PEP,':' (E203) 之前不应有空格。

【讨论】:

这不符合PEP8,因为':'之前有空格(E203)。【参考方案6】:

绝对不是选项 1,Python 的优势之一是它的易读性。选项 1 严重降低了可读性。

在 2 和 3 中,我将重复 pyfunc 为两者陈述的相同原因。

但是,在我自己的代码中,我更喜欢选项 3,因为第一个元素有时会因为位于声明行的末尾而“丢失”,并且在快速浏览代码时有时我不会立即看到它。我知道这有点傻,但大脑以神秘的方式运作......

【讨论】:

【参考方案7】:

好吧,第一个是不行的,因为你的行应该只有 79 个字符宽。至于其他两个选项,我想这是一个口味问题,但我个人更喜欢第二个选项。

【讨论】:

【参考方案8】:

我更喜欢第二个或第三个。

原因:

    每个元素都独占一行 到达行尾以添加新元素在文本编辑器中是一种痛苦 添加新元素很容易 使用第三个选项,有时您可以通过选择这些行来检查元素的数量。大多数编辑器会告诉您选定的行数。

【讨论】:

@aaronasterling:是的,我应该写第二个和第三个选项。 我不同意#2。使用能够为您提供动力而不是限制您的文本编辑器。【参考方案9】:

我喜欢第二种方式:

something = 'foo' : 'bar',
         'foo2' : 'bar2',
         'foo3' : 'bar3',
         ...
         'fooN': 'barN'

【讨论】:

【参考方案10】:

在阅读这篇文章之前,我会选择您给出的第三个选项。但现在我可能会选择不是 Török Gábor 的风格:

我的字典 = 1:“某事”, 2:'其他东西',

但老实说,除了你的第一个选项之外的任何东西都可能没问题。

【讨论】:

【参考方案11】:

我想提一下以下选项,PEP8 中没有特别提到,但在dictionary documentation 中有说明:“当键是简单字符串时,使用关键字参数指定对有时更容易:”

my_dict = dict(
    foo = 1,
    bar = 2,
    baz = 3,
    ...
)

然而,它并没有解决缩进问题。

【讨论】:

以上是关于用于列表、字典等的 Python“最佳格式化实践”的主要内容,如果未能解决你的问题,请参考以下文章

python 第34课 字典 _ 序列解包用于列表元组字典

python 第34课 字典 _ 序列解包用于列表元组字典

Python列表,元组,字典,集合的比较总结【表格对比】

python:字典嵌套列表

用于足迹的纬度/经度的 Python 排序字典

在 Python 循环中构建字典 - 列表和字典理解