gpt4 book ai didi

Python - 短语法和列表理解和迭代

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:07 24 4
gpt4 key购买 nike

我是 Python 列表理解的忠实粉丝,我认为它实际上比常规迭代更容易阅读。

我正在编写一个构造函数,它在 **kwargs 中具有可选参数,可用于设置类的属性,我想将其写成列表理解,但看起来拥有一个实际上什么都不做的列表毫无意义。考虑一下:

class Book(object):
attrs = ('id', 'title', 'authors',...)
def __init__(self, *args, **kwargs):
[setattr(self, attr, kwargs.get(attr)
for attr in O.attrs if kwargs.get(attr)]

虽然语法看起来不错,但我认为这是糟糕的编码,因为您创建了一个列表

[None, None, None...]

那只是坐在那里。是的,我知道它是在构造函数运行后收集的,但我仍然不喜欢它。如果我读过某人的代码,我会不以为然。

是否有更好的方法来进行与列表理解一样干净但不会创建无用对象的迭代

编辑:

响应使用循环

class Book(object):
attrs = ('id', 'title', 'authors',...)
def __init__(self, *args, **kwargs):
for attr in attrs:
if kwargs.get(attr):
setattr(self, attr, kwargs.get(attr)

你们是这个意思吗?如果不是,还有什么更好的写法?

最佳答案

您可以使用生成器表达式来代替列表理解,更新 instance __dict__ attribute直接:

class Book(object):
attrs = ('id', 'title', 'authors',...)
def __init__(self, *args, **kwargs):
self.__dict__.update(
(attr, kwargs[k]) for k in kwargs.viewkeys() & self.attrs)

这也利用了 dictionary views ;在 Python 3 中,只需使用 kwargs.keys() 而不是 kwargs.viewkeys()。字典 View 充当集合; & self.attrs 表达式生成 kwargs 的键和您的属性列表之间的交集。

生成器表达式生成(key, value) 对,这是dict.update() method 的两个可接受输入之一。 .

更新 self.__dict__ 就好了; Python 2.7 标准库在 7 个不同的位置以及大约 30 个其他突变案例中使用了这种技术。请务必考虑到,如果您正在使用描述符(@property 和/或其他自定义描述符),那么访问 self.__dict__ 将绕过这些描述符。

至于对副作用的列表理解:只是不要。您确实在浪费周期来创建一个立即被丢弃的列表对象,混淆了列表理解用于的预期。

您还可以在常规 for 循环中将其与显式 setattr() 调用结合起来:

for attr in kwargs.viewkeys() & self.attrs:
setattr(self, attr, kwargs[attr])

关于Python - 短语法和列表理解和迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24949423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com