python - **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 循环不应该以类似的方式表现吗?
编辑:为什么反对票?我试图理解这里的事情。
解决方案
编码风格
您在列表理解中滥用副作用。这被认为是非常糟糕的做法。
__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)
推荐阅读
- java - 自定义事件 Java
- javascript - 我怎样才能通过 forEach() 做到这一点?
- vb.net - 在 Visual Studio 的调试中未执行代码更改
- database - 如何使用 jsp 和仅使用一张表的数据库创建动态下拉列表?
- sql-server - 子查询返回超过 1 个值。子查询用作表达式
- c# - 使用流利的 Nhibernate 插入时,Oracle DB 法语字符将替换为垃圾值
- python - 为什么在 numpy.array() 中与 list 一起传递时 reverse() 函数不起作用?
- python-3.x - Python 3.x - 确定循环何时停止两个变量?
- ios - UICollection 视图 didSelectItemAtIndexPath 无法正常工作
- android - TextView 未显示来自字符串资源的正确文本。