使用PyCharm,我注意到它提供转换字典文字:

d = {
    'one': '1',
    'two': '2',
}

转换为dict构造函数:

d = dict(one='1', two='2')

这些不同的方法是否在某些重要的方面有所不同?

(在写这个问题时,我注意到使用dict()似乎不可能指定一个数字键..D = {1: 'one', 2: 'two'}是可能的,但显然,dict(1='one'…)是不可能的。还有别的事吗?)


当前回答

这两种方法生成的字典完全相同,只是,正如您所注意到的,Python的词法规则有影响。

字典字面量是更明显的字典,您可以创建任何类型的键,但您需要引用键名。另一方面,如果你出于某种原因需要,你可以使用变量作为键:

a = "hello"
d = {
    a: 'hi'
    }

dict()构造函数为您提供了更大的灵活性,因为它采用多种形式的输入。例如,您可以为它提供一个对迭代器,它将把它们视为键/值对。

我不知道为什么PyCharm会提供将一种形式转换为另一种形式。

其他回答

此外,当涉及到阅读代码(这是很多)时,我觉得文字的认知负担更少(因为我们将文字与dict()联系在一起,它看起来像一个函数调用,让大脑怀疑……与dict()相比,至少有一微秒:)),不可否认,部分原因是编辑器中的语法高亮显示,但在日常生活中仍然非常相关(至少对我来说)。

如果我关注dict语句周围的代码,表示为…,一个字面dict使我更容易理解周围的代码:)。

...
...
...
config = {
    'key1':"value1",
    'key2':"value2",
    'key3':"value3",
    'key4':"value4",
}
...
...
...

#****VS *****

...
...
...
config =dict(
    key1 = 'value1',
    key2 = 'value2',
    key3 = 'value3',
    key4 = 'value4',

)
...
...
...

这两种方法生成的字典完全相同,只是,正如您所注意到的,Python的词法规则有影响。

字典字面量是更明显的字典,您可以创建任何类型的键,但您需要引用键名。另一方面,如果你出于某种原因需要,你可以使用变量作为键:

a = "hello"
d = {
    a: 'hi'
    }

dict()构造函数为您提供了更大的灵活性,因为它采用多种形式的输入。例如,您可以为它提供一个对迭代器,它将把它们视为键/值对。

我不知道为什么PyCharm会提供将一种形式转换为另一种形式。

还要考虑这样一个事实:与运算符匹配的令牌不能在构造函数语法中使用,即dasherized key。

>>> dict(foo-bar=1)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression

>>> {'foo-bar': 1}
{'foo-bar': 1}

当你从其他东西(非python)复制粘贴值时,dict()文字很好用 例如,环境变量列表。 如果您有一个bash文件

FOO='bar'
CABBAGE='good'

您可以轻松地将其粘贴到dict()文本中并添加注释。它也使它更容易做相反的事情,复制到其他东西。而{'FOO': 'bar'}语法对于python和json来说是非常独特的。所以如果你经常使用json,你可能会想要使用带有双引号的{}字面量。

没有字典文字来创建字典继承类,自定义字典类与额外的方法。在这种情况下,应该使用自定义dict类构造函数,例如:

class NestedDict(dict):

    # ... skipped

state_type_map = NestedDict(**{
    'owns': 'Another',
    'uses': 'Another',
})