为了实现美化的xml,我编写了以下代码
def prettify_by_response(response, prettify_func):
root = ET.fromstring(response.content)
return prettify_func(root)
def prettify_by_str(xml_str, prettify_func):
root = ET.fromstring(xml_str)
return prettify_func(root)
def make_pretty_xml(root):
rough_string = ET.tostring(root, "utf-8")
reparsed = minidom.parseString(rough_string)
xml = reparsed.toprettyxml(indent="\t")
return xml
def prettify(response):
if isinstance(response, str) or isinstance(response, bytes):
return prettify_by_str(response, make_pretty_xml)
else:
return prettify_by_response(response, make_pretty_xml)在prettify_by_response和prettify_by_str函数中,我将make_pretty_xml函数作为参数传递
我可以简单地调用该函数,而不是将函数作为参数传递。
def prettify_by_str(xml_str, prettify_func):
root = ET.fromstring(xml_str)
return make_pretty_xml(root)与直接调用函数相比,将函数作为参数传递给这些函数优点之一是,该函数与make_pretty_xml函数没有紧密耦合。
还会有什么其他优势,或者我会增加额外的复杂性?
发布于 2019-07-04 10:50:33
这似乎对有偏见的答案非常开放,我将努力做到公正,但我不能做出任何承诺。
首先,高阶函数是接收和/或返回函数的函数。优点是值得怀疑的,我将尝试列举HoF的用法,并阐明每种用法的优缺点
回调
回调是作为阻塞调用的解决方案出现的。我需要在A之后执行B,所以我调用在A上阻塞的东西,然后调用B。这自然会导致这样的问题,嗯,我的系统浪费了很多时间等待事情发生。如果我可以将需要做的事情作为参数传递,而不是等待会怎样呢?因为技术中任何新的东西都还没有扩展,在扩展之前似乎是一个好主意。
回调在事件系统中非常常见。如果你用javascript编写每一段代码,你就会明白我在说什么。
算法抽象
一些设计,主要是行为设计,可以在运行时利用HoF选择某种算法。您可以有一个高级算法,它接收处理低级内容的函数。这导致了更多的抽象、代码重用和可移植代码。在这里,可移植意味着您可以编写代码来处理新的低级,而无需更改高级级别。这与HoF无关,但可以利用它们来获得极大的帮助。
将行为附加到另一个函数
这里的想法是将一个函数作为参数,并返回一个函数,该函数执行参数函数所做的事情,外加一些附加的行为。这就是(我认为) HoF真正闪亮的地方。
Python装饰器就是一个很好的例子。它们将一个函数作为参数,然后返回另一个函数。此函数附加到与第一个函数相同的标识符
@foo
def bar(*args):
...是相同的
def bar(*args):
...
bar = foo(bar)现在,思考一下这段代码
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)fib只是一个斐波纳契函数。它计算直到n的斐波纳契数。现在lru_cache附加了一个新的行为,缓存先前已经计算过的值的结果。fib函数内部的逻辑不受LRU缓存逻辑的影响。我们在这里有一个多么漂亮的抽象。
应用型编程或无指针编程
这里的想法是删除变量或点,并结合函数应用程序来表示算法。我相信有很多人在这个话题上比我更好,如此漫游。
顺便说一句,这在python中不是很常见的样式。
for i in it:
func(i)from functools import partial
mapped_it = map(func, it)在第二个示例中,我们删除了i变量。这在解析世界中很常见。作为另一个副节点,map函数在Python语言中是惰性的,因此直到遍历mapped_it时,第二个示例才会生效
你的案例
在本例中,您将返回回调调用的值。实际上,您不需要回调,您可以像以前一样简单地排列调用,对于这种情况,您不需要HoF。
我希望这能有所帮助,也希望有人能展示更好的应用风格的例子:)
问候
https://stackoverflow.com/questions/56879453
复制相似问题