Python是否支持对象字面量属性值简写,类似于ECMAScript 6?

20
在ECMAScript 6中,我可以像这样做...
var id = 1;
var name = 'John Doe';
var email = 'email@example.com';
var record = { id, name, email };

...作为这个的简写:

var id = 1;
var name = 'John Doe';
var email = 'email@example.com';
var record = { 'id': id, 'name': name, 'email': email };

Python 中有类似的功能吗?


可能是Python变量作为字典键的重复问题。 - Bhargav Rao
4
不,{ id,name,email }是Python中的一个集合字面量。 - Ashwini Chaudhary
4个回答

10
不可以,但你可以通过这样做来实现相同的效果。
record = {i: locals()[i] for i in ('id', 'name', 'email')}

(感谢Python变量作为字典键)

您直接在Python中输入的示例与集合相同,并不是字典。

{id, name, email} == set((id, name, email))

3
不,Python中没有类似的速记法。这甚至会导致与“set”字面值的歧义,因为它们具有精确的语法:
>>> foo = 'foo'
>>> bar = 'bar'
>>> {foo, bar}
set(['foo', 'bar'])
>>> {'foo': foo, 'bar': bar}
{'foo': 'foo', 'bar': 'bar'}

2

由于设置文字量,你不能轻松地使用对象字面缩写,而且locals()有点不安全。

我几年前写了一个hacky gist,创建了一个d函数,您可以使用它,例如:

record = d(id, name, email, other=stuff)

我会尝试将其更好地打包。


0

是的,你可以使用一个名为sorcery的黑魔法库来很好地实现这一点,它提供了dict_of

x = dict_of(foo, bar)
# same as:
y = {"foo": foo, "bar": bar}

请注意,您也可以像ES6一样进行解包:
foo, bar = unpack_keys(x)
# same as:
foo = x['foo']
bar = x['bar']

这可能会让有经验的Python程序员感到困惑,对于性能敏感的代码路径来说可能不是一个明智的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接