首页 > 解决方案 > **kwargs:为什么下面的列表理解不打印输出而正常的 for 循环呢?

问题描述

在 Python 3 中,我尝试**kwargs使用列表推导打印 a 的输出。我无法这样做,而使用for循环确实打印了我的列表输入的元素。以下是可重现的代码:

使用列表理解:

class Practice(object):
    __acceptable_keys_list = ['Right', 'left']

    def __init__(self, **kwargs):
        temp = ([self.__setattr__(key, kwargs.get(key)) for key in self.__acceptable_keys_list])
        print(temp)

输出是[None, None]

在哪里使用for循环:

class Practice(object):
    __acceptable_keys_list = ['Right', 'Left']

    def __init__(self, **kwargs):   
         for key in self.__acceptable_keys_list:
             self.__setattr__(key,kwargs.get(key))
             print(key)

输出是[Right, Left]

为什么有区别?我错过了什么?list comp 和 for 循环不应该以类似的方式表现吗?

编辑:为什么反对票?我试图理解这里的事情。

标签: pythonpython-3.x

解决方案


编码风格

您在列表理解中滥用副作用。这被认为是非常糟糕的做法

__setattr__ 的返回值

尽管如此,正如@Aran-Fey 已经提到的,__setattr__返回None。您的代码不等效。下面的代码做同样的事情:

class Practice(object):
    __acceptable_keys_list = ['Right', 'Left']

    def __init__(self, **kwargs):
        # Please do **NOT** do this at home!
        temp = ([self.__setattr__(key, kwargs.get(key)) for key in self.__acceptable_keys_list])
        print(temp)

class Practice(object):
    __acceptable_keys_list = ['Right', 'Left']

    def __init__(self, **kwargs):
         temp = []
         for key in self.__acceptable_keys_list:
             # Use the return value of __setattr__, which is None
             temp.append(self.__setattr__(key,kwargs.get(key)))
         print(temp)

推荐阅读