在Python中格式化多行字典的正确方法是什么?


182

在Python中,我想在代码中编写多行字典。有几种方法可以格式化它。我想到的是一些:

  1. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3, }
  2. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3,
             }
  3. mydict = {
        "key1": 1,
        "key2": 2,
        "key3": 3,
    }

我知道以上任何一种在语法上都是正确的,但是我假设Python字典有一种首选的缩进和换行样式。它是什么?

注意:这不是语法问题。就我所知,以上所有都是有效的Python语句,并且彼此等效。


12
对于图1和2:没有空间直接内部的括号,见PEP 8.
斯文Marnach

3
我想说的是,在pythons pprint模块中,它使用您的第一个示例,括号内没有空格。
charmoniumQ 2013年

Answers:


238

我使用#3。长列表,元组等也是如此。不需要在缩进之外添加任何额外的空格。一如既往,保持一致。

mydict = {
    "key1": 1,
    "key2": 2,
    "key3": 3,
}

mylist = [
    (1, 'hello'),
    (2, 'world'),
]

nested = {
    a: [
        (1, 'a'),
        (2, 'b'),
    ],
    b: [
        (3, 'c'),
        (4, 'd'),
    ],
}

同样,这是在不引入任何空格的情况下包括大字符串的我的首选方式(例如,如果使用三引号的多行字符串,则会得到此信息):

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)

您能否提供一些参考,我在此方面找不到权威来源。(我同意你的意见)。
Trufa

82
嗯,我发现这一点:stackoverflow.com/questions/6388187/...
FogleBird

6
不要告诉他,但该用户不知道他在说什么; P
Trufa

3
大声笑,更严重的是,我也找不到“权威”参考。我会告诉你!也许有人应该联系Guido。
2011年

2
这符合PEP 8:python.org/dev/peps/pep-0008/#indentation。在缩进部分的底部有一些列表示例。
ams

30

首先,就像史蒂文·鲁姆巴尔斯基(Steven Rumbalski)所说的那样,“ PEP8不能解决这个问题”,因此这是个人喜好问题。

我将使用与您的格式3类似但不完全相同的格式。这是我的,以及原因。

my_dictionary = { # Don't think dict(...) notation has more readability
    "key1": 1, # Indent by one press of TAB (i.e. 4 spaces)
    "key2": 2, # Same indentation scale as above
    "key3": 3, # Keep this final comma, so that future addition won't show up as 2-lines change in code diff
    } # My favorite: SAME indentation AS ABOVE, to emphasize this bracket is still part of the above code block!
the_next_line_of_code() # Otherwise the previous line would look like the begin of this part of code

bad_example = {
               "foo": "bar", # Don't do this. Unnecessary indentation wastes screen space
               "hello": "world" # Don't do this. Omitting the comma is not good.
} # You see? This line visually "joins" the next line when in a glance
the_next_line_of_code()

btw_this_is_a_function_with_long_name_or_with_lots_of_parameters(
    foo='hello world',  # So I put one parameter per line
    bar=123,  # And yeah, this extra comma here is harmless too;
              # I bet not many people knew/tried this.
              # Oh did I just show you how to write
              # multiple-line inline comment here?
              # Basically, same indentation forms a natural paragraph.
    ) # Indentation here. Same idea as the long dict case.
the_next_line_of_code()

# By the way, now you see how I prefer inline comment to document the very line.
# I think this inline style is more compact.
# Otherwise you will need extra blank line to split the comment and its code from others.

some_normal_code()

# hi this function is blah blah
some_code_need_extra_explanation()

some_normal_code()

我喜欢在线评论。我的第一位编程教授(我已经编程多年了)坚持使用内联注释,但从未有效地解释原因。您现在已经说明了我使用大约20年的做法。
约书亚K

啊哈,谢谢。在编程方面,我们有相似的年龄,经验和“里程”。因此,如果您在20年前就已经开始进行内联评论实践(这真是令人印象深刻!),那么为什么大概在10年前您还在大学时还需要教授的解释呢?只是好奇。:-)
RayLuo

一个非常好的问题:) ATARI BASIC和GWbasic实际上是强制使用它,因为它们是自上而下的基于流水线的编译器。这是我在纸质杂志上阅读彼得·诺顿的BASIC(以及后来的ASM代码)时采用的。我在两者之间学习了Turbo Pascal,但是我已经从纸质杂志的示例中学到了东西,并且符合BASIC的局限性。
约书亚K

PEP8在某种程度上解决了该问题,因为它建议不要在开括号后立即添加空格,因此OP中的选项1和2无效。
Daniel Serodio

9

由于您的键是字符串,并且因为我们在谈论可读性,所以我更喜欢:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)

6
定义kwarg时,最好不要使用空格。c = function(a=1, b=2)更“ pythonic”。
史蒂夫·K


0
dict(rank = int(lst[0]),
                grade = str(lst[1]),
                channel=str(lst[2])),
                videos = float(lst[3].replace(",", " ")),
                subscribers = float(lst[4].replace(",", "")),
                views = float(lst[5].replace(",", "")))

这并不能回答问题
Bagerard

-1

根据我在教程和其他方面的经验,似乎总是首选2号,但这是个人喜好选择,而不是其他任何事情。


-6

通常,您不会在最后一个输入项后加入逗号,但Python会为您更正。


34
没有!始终包含最后一个逗号,因此,如果添加新的最后一个元素,则不必在其前更改行。这是Python的一大优点:实用性胜于纯度。
Ned Batchelder

2
此外,此答案不能解决所提出的问题。
RKD314 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.