Python 初始化dict:curly brace literals{}或dict()函数的首选语法是什么?

Python 初始化dict:curly brace literals{}或dict()函数的首选语法是什么?,python,dictionary,Python,Dictionary,我正在努力学习Python,并密切关注常见的编码标准。这似乎是一个毫无意义的吹毛求疵的问题,但我在学习的过程中会努力专注于最佳实践,所以我以后不必忘记任何“坏”习惯 我看到两种初始化dict的常用方法: a = { 'a': 'value', 'another': 'value', } b = dict( a='value', another='value', ) 哪一个被认为是“更像蟒蛇”?你用哪一种?为什么?第一个,花括号。否则,您会遇到包含奇数字符的键

我正在努力学习Python,并密切关注常见的编码标准。这似乎是一个毫无意义的吹毛求疵的问题,但我在学习的过程中会努力专注于最佳实践,所以我以后不必忘记任何“坏”习惯

我看到两种初始化dict的常用方法:

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

哪一个被认为是“更像蟒蛇”?你用哪一种?为什么?

第一个,花括号。否则,您会遇到包含奇数字符的键的一致性问题,如
=

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

第一个版本更可取:

  • 它适用于所有类型的键,例如,您可以说
    {1:'one',2:'two'}
    。第二种变体仅适用于(某些)字符串键。根据键的类型使用不同种类的语法将是不必要的不一致
  • 速度更快:

    $ python -m timeit "dict(a='value', another='value')"
    1000000 loops, best of 3: 0.79 usec per loop
    $ python -m timeit "{'a': 'value','another': 'value'}"
    1000000 loops, best of 3: 0.305 usec per loop
    
  • 如果不打算使用字典文本的特殊语法,它可能不存在

花括号。将关键字参数传递到
dict()
,虽然它在许多场景中都能很好地工作,但只有在键是有效的Python标识符时才能初始化映射

这项工作: 这行不通: 这将导致以下错误:

    a = dict(import='trade', 1=7.8)
             ^
SyntaxError: invalid syntax

我认为第一个选项更好,因为您将以['a']或['other']的形式访问这些值。字典中的键是字符串,没有理由假装它们不是字符串。对我来说,关键字语法一开始看起来很聪明,但第二眼就看不清了。只有当您使用
\uuu dict\uuuu
,并且关键字稍后将成为属性时,这才有意义。

FYI,如果您需要向词典添加属性(附在词典上但不是其中一个键的内容),那么您需要第二种形式。在这种情况下,可以使用具有任意字符的键初始化字典,一次一个,如下所示:

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False
有时,
dict()
是一个不错的选择:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

我几乎总是用花括号;但是,在某些情况下,我编写测试时会使用关键字打包/解包,在这些情况下,dict()更易于维护,因为我不需要更改:

a=1,
b=2,
致:

在某些情况下,它也会有所帮助,我想以后可能会将其转换为namedtuple或类实例

在实现本身中,由于我对优化的痴迷,并且当我没有看到特别巨大的可维护性好处时,我总是喜欢花括号

在测试和实现中,如果当时或将来添加的键可能会:

  • 不总是一根弦
  • 不仅包含数字、ASCII字母和下划线
  • 以整数开始(
    dict(1foo=2)
    引发语法错误)

您使用的是什么教程?您在哪里看到了导致混淆的示例?嗯,我一直在使用Python教程,深入研究Python,然后是各种博客,以及帖子和其他Google资源。官方文档非常统一地使用
{}
,但我在其他地方看到了很多显式的
dict()
方法。我可以看到显式语法的好处,但官方文档中缺少这种方法让我产生了怀疑。在发布这篇文章之后,我查看了
dict
的库文档,发现当使用显式
dict
初始化dict时,键必须是有效的标识符。如何使“dict()”比“{}”更显式?我不理解你的困惑。对我来说这两个都很明确。你能提供一个引用或参考,让你说“dict”是“显式的”而“{}”不是显式的吗?你认为这种区别是从哪里来的?区别在于拼写
dict()
拼写为
dict
——它使用类型的名称。大括号(
{}
)依赖标点符号来标识类型。有一个枚举函数可以更好地做到这一点。就这点而言,有一种枚举类型可以更好地完成您在这里所做的工作。此外,这根本不是问题的答案。回滚格式错误、分散注意力的编辑器这正是人们可能更喜欢dict()方法进行初始化的原因,它强制字典键为有效标识符,因此它们与**kwargs兼容,并且键为有效的属性名。
    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False
a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))
a=1,
b=2,
'a': 1,
'b': 2,