Pet*_*ete 6 python function matplotlib
这是来自matplotlib中csv2rec的源代码
如果它的唯一参数是'func,default',这个函数怎么能工作呢?
def with_default_value(func, default):
def newfunc(name, val):
if ismissing(name, val):
return default
else:
return func(val)
return newfunc
Run Code Online (Sandbox Code Playgroud)
ismissing采用名称和值,并确定是否应该在numpy数组中屏蔽该行.
func将是str,int,float或dateparser ...它转换数据.也许并不重要.我只是想知道如何获得'名字'和'价值'
我是初学者.感谢任何2cents!我希望能够帮助他人!
这个with_default_value函数经常被称为(不精确地)为"闭包"(技术上,闭包是返回的内部函数,在这里newfunc- 参见例如此处).更一般地说,with_default_value是一个高阶函数("HOF"):它将一个函数(func)作为参数,它还返回一个函数(newfunc)作为结果.
我看到的答案令人困惑,它与装饰器概念和Python中的构造混淆,绝对不是这样 - 特别是因为你提到的func往往是内置的,如int.装饰器也是高阶函数,而是特定的函数:返回其函数参数的装饰(即"丰富")版本的函数(必须是唯一的参数 - "带参数的装饰器")通过另一个级别获得函数/闭包嵌套,而不是通过赋予装饰器HOF多个参数),它被重新分配到与该函数参数完全相同的名称(因此通常具有相同的签名 - 使用装饰器,否则将非常特殊,不惯用的,不可读的等等).
所以忘记装饰器,它与表壳完全无关,并专注于newfunc闭合.词汇嵌套函数可以引用(但不重新绑定)封闭函数的所有局部变量名称(包括参数名称,因为参数是局部变量) - 这就是它被称为闭包的原因:它被"封闭"这些"自由变量".在这里,newfunc可以参考func和default- 并且确实如此.
高阶函数在Python中是很自然的东西,特别是因为函数是第一类对象(所以你不需要做任何特殊的事情来将它们作为参数传递,将它们作为函数值返回,甚至将它们存储在列表或其他容器中等等,并且在函数和其他类型的对象之间没有命名空间区别,没有因为提及等等而自动调用函数等等(这更难 - 更难 - 或者更难,取决于 - 在其他语言中这确实吸引了很多这种区别).在Python中,提到一个函数只是 - 提及; 只有当函数对象(由名称或其他方式引用)后跟括号时,才会发生CALL.
这就是这个例子中的所有内容 - 如果您还有其他一些具体方面存在疑问,请随时编辑您的问题,在此发表评论等.
编辑:所以OP评论道,要求提供更多"封闭工厂"的例子.这是一个 - 想象一些抽象的GUI工具包,你正在尝试:
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
Run Code Online (Sandbox Code Playgroud)
但是这不起作用 - i在lambda后期限制内,所以当点击一个按钮时,无论点击哪个按钮,其i值始终是最后一个按钮的索引.有各种可行的解决方案,但封闭工厂的优雅可能性:
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用闭包工厂来调整变量的绑定时间! - )在一种特定的形式或另一种形式中,这是闭包工厂的一个非常常见的用例.
这是一个Python装饰器 - 基本上是一个函数包装器.(阅读PEP 318中有关装饰器的所有信息 - http://www.python.org/dev/peps/pep-0318/)
如果你查看代码,你可能会发现这样的事情:
def some_func(name, val):
# ...
some_func = with_default_value(some_func, 'the_default_value')
Run Code Online (Sandbox Code Playgroud)
如果缺少name或val参数,那么这个装饰器的意图似乎提供了一个默认值(假设它们被设置为None).
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |