题
这是从csv2rec在matplotlib源代码
如何能该功能工作,如果它的参数只有“FUNC,默认”?
def with_default_value(func, default):
def newfunc(name, val):
if ismissing(name, val):
return default
else:
return func(val)
return newfunc
ISMISSING需要一个名称和一个值,并且确定该行应该以numpy的阵列被屏蔽。
FUNC要么被海峡,整数,浮点,或dateparser ...其转换数据。也许并不重要。我只是想知道如何才能得到一个“名称”和“值”
我是初学者。感谢您的任何分钱小费!我希望能得到足够好去帮助别人!
解决方案
这with_default_value
功能是什么通常称为(不准确)的“封闭”(从技术上说,关闭是相当的的内的获取返回的功能,在这里newfunc
- 例如见的这里)。更一般地,with_default_value
是高阶函数(“HOF”):它需要一个函数(func
)作为参数,它也返回一个函数(newfunc
)作为结果
我看到答案用的装饰的概念混淆这一点,并在Python,这绝对是不会的情况下构建 - 尤其是因为你提到func
经常是一个内置诸如int
。装饰也是高阶函数,而是具体的:那些它返回一个装饰,即“丰富”,其功能参数的版本(必须的只有的说法 - “带参数的装饰”通过功能/闭合嵌套,不的一个多水平通过给予装饰HOF多于一个参数),它被重新分配到完全相同的名称作为函数参数(因此通常具有相同的获得签名 - 。使用装饰否则将是极特有的,未惯用的,不可读,等)
所以,不要装饰,这绝对无关的情况下,并专注于newfunc
关闭。词法嵌套函数可以参考(虽然不是重新绑定)所有本地变量名称(包括参数名称,因为参数是局部变量)的封闭功能(S)的 - 这就是为什么它被称为闭包:它的“关闭了”这些“自由变量”。这里,newfunc
可以参考func
和default
- 和确实
高阶函数在Python中很自然的事情,尤其是因为函数是第一类对象(所以没有什么特别的,你需要做的,他们作为参数传递,返回它们作为函数值,甚至可以将它们存储在列表或其他容器等),并有对象的功能和其他种类之间没有命名空间的区别,只是因为他们提到的功能,等等,等等没有自动呼叫(这是很难 - 有点困难,或者更难,这取决于 - 在做抽签这种区别)的其他语言。在Python中,提到的功能就是这样 - 一提;的CALL只发生和当其功能对象(通过名称提及或以其它方式)之后是括号中。
这是对所有有这个例子 - !请不要随意修改你的问题,在这里评论等,如果有,你仍然怀疑其他的一些具体方面
修改强>:所以OP评论说礼貌要求的 “关闭工厂” 更多的例子。这里有一个 - 想象一些抽象的一种GUI工具包的,而你要做的:
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
但是这不工作的权利 - 在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))
在这里,我们使用了封闭工厂调整的变量绑定时间 - !)。在一个特定的形式或其他形式,这是一个很常见的用例关闭工厂
其他提示
这是一个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')
这个装饰的目的似乎如果名称或VAL参数丢失提供一个默认值(推测,如果它们被设置为无)。
至于为什么它的工作原理:
with_default_value返回一个功能对象,它基本上将是一个复制该嵌套newfunc,用“FUNC”的呼叫和默认值与任何传递给with_default_value substited。
如果有人做“富= with_default_value(巴,3)”中,返回值是基本上将是一个新的功能:
def foo(name, val):
ifismissing(name, val):
return 3
else:
return bar(val)
这样你就可以采取的返回值,并调用它。
这是返回另一个函数的函数。 name
和value
是返回的函数的参数。