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