【发布时间】:2016-01-11 11:47:47
【问题描述】:
我们应该如何在 Python 中编写文件同时保持功能纯正?通常我会做这样的事情
from typing import Iterable
from io import IOBase
def transform_input(input_lines: Iterable[str]) -> Iterable[str]: ...
def print_pack(input_lines: Iterable[str], output: IOBase) -> None:
for line in input_lines:
print(line, file=output)
def main(*args, **kwargs):
# Somehow we get a bunch iterables with strings and a list of output streams
packs_of_input = ... # Iterable[Iterable[str]]
output_streams = ... # Iterable[IOBase]
packs_to_print = map(transform_input, packs_of_input)
for pack, output_stream in zip(packs_to_print, output_streams):
print_pack(pack, output_stream)
我们可以用类似这样的东西替换for-loop
list(map(lambda pack_stream: print_pack(*pack_stream), zip(packs_to_print, output_streams))
但它只会使打印看起来像是在功能上完成的。问题是print_pack 不是一个纯函数,它的所有努力都会产生副作用并且它什么也没有返回。
我们应该如何编写文件并保持功能纯(或几乎纯)?
【问题讨论】:
-
您为什么要这样做?
for循环是最易读的,而且是最“正确”的方式。 -
@tobias_k 我不认为我会在任何严肃的项目中使用它,但我想知道这些事情是如何完成的。了解一个完全不同的范例总是一件好事,即使您不打算使用它。
-
我将定义一个包含
for循环的forEach方法,并使用它。def forEach(iterable, func): for i in iterable: func(i)然后forEach(input_lines, lambda x: print(x, file=output))。 (无论如何,函数式编程只是将 for 循环移到其他地方) -
@CongMa 是的,看起来很有希望。
标签: python python-3.x io functional-programming