将PEP 448 Python 3.5代码转换为兼容Python 3.4的代码

3

I have the following function:

    def to_url(self):
    return {
        'ass_cls': self.model.__class__.__name__,
        **{local.name: getattr(self.model.src, remote.name)
           for local, remote in self.model.__class__.src.property.local_remote_pairs},
        **{k: v
           for k, v in self.model.__dict__.items()
           if not k.startswith('_') and k != 'src'},
    }

我该如何将这段代码转换为Python 3.4兼容的代码?

我相信,这段代码目前正在使用PEP 448 - 额外的解包泛化,这是Python 3.5的新特性。


除了缩进之外,它现在有什么问题吗? - MattDMo
@MattDMo 这个程序使用了 Python 3.5 的特性 :) 它在 Python 3.4 中无法运行。 - kirillbobyrev
2
有许多方法可以完成它,这里是一个一行代码:dict(ass_cls=1, **dict(dict_comp_1, **dict_comp_2))。基本上,你需要的是所有字典中获得的键组合在一起的扁平化字典。 - Ashwini Chaudhary
@omtcyf0 或许你可以强调一下具体是哪些功能,或者提供3.4版本的错误信息,这样每个读者就不必自己去解决问题了。 - jonrsharpe
因此,3.5 版本的新特性是嵌套 {} 语法。如果字典在一个或多个表达式中单独创建,则表达式会更清晰。 - hpaulj
显示剩余4条评论
1个回答

3
新的拆包功能是在3.4中不可用的,你需要使用旧的更冗长的方法来合并字典。 这里 介绍了更多关于拆包功能的内容。
def to_url(self):
    d = {'ass_cls': self.model.__class__.__name__}
    d.update({local.name: getattr(self.model.src, remote.name) 
        for local, remote in self.model.__class__.src.property.local_remote_pairs})
    d.update({k: v for k, v in self.model.__dict__.items()
        if not k.startswith('_') and k != 'src'})
    return d

2
你也可以将生成器表达式(产生“键,值”二元组)传递给update,而不是使用推导式创建子字典。虽然我不确定它是否更快(尽管它应该使用更少的峰值内存),但对我来说似乎更自然。只需删除{},并使用(k, v)代替k: v即可。 - Blckknght

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