【发布时间】:2017-08-23 20:12:30
【问题描述】:
我正在制作一个适用于以下一般形式的聊天文件的程序:
- 打开文件和导入行(通过
readlines) - 执行初始传递,通过以下方式将字符串列表转换为格式更好的数据(当前为 dicts):
- 丢弃畸形行
- 从消息文本中分离出用户名
- 为被忽略的(通常是机器人)用户丢弃线路
- 标记哪些行是
/me命令
- 再次遍历字典列表以对其应用各种操作,例如:
- 用别名替换所有提及的昵称
- 对
/me命令应用特殊格式
与其在配置文件中有多个开关并在循环中进行大量if 语句检查,我相信如果我在其他地方生成函数列表然后向程序提供字典列表(或字符串,取决于我在程序的哪个部分)和函数列表,以便函数列表应用于对象列表中的每个项目。
It seems that this probably would be a good case for list comprehensions 如果我只对每个项目应用一个函数,但我不想为我要调用的每个函数单独传递日志。不过this answer notes that list comprehension probably aren't what I want, since they return a completely new list,而不是原地修改。
拥有以下两种变体是我的最佳选择吗?
for item in list:
item = a(b(c(d(item, dparam1, dparam2), cparam)), aparams)
(为了便于阅读,我将每个函数单独放在一行中,例如:
for item in list:
item = d(item, dparam1, dparam2)
item = c(item, cparam)
item = b(item)
item = a(item, aparams)
但是,以上内容并没有消除对所有开关进行if 检查的需要,并且不允许在两个不同的位置应用函数a,除非我明确添加开关来这样做。
【问题讨论】:
-
您能否提供一些示例输入和输出作为minimal reproducible example 的一部分?我在您当前的代码中没有看到任何直接的警告信号 - 在这种情况下,包装函数是完全正常的。此外,推导可以替换现有列表的所有项目,而不是使用例如创建单独的列表对象。
L[:] = [f(i) for i in L].
标签: python list function python-3.x