这是从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可以参考funcdefault - 和确实

高阶函数在Python中很自然的事情,尤其是因为函数是第一类对象(所以没有什么特别的,你需要做的,他们作为参数传递,返回它们作为函数值,甚至可以将它们存储在列表或其他容器等),并有对象的功能和其他种类之间没有命名空间的区别,只是因为他们提到的功能,等等,等等没有自动呼叫(这是很难 - 有点困难,或者更难,这取决于 - 在做抽签这种区别)的其他语言。在Python中,提到的功能就是这样 - 一提;的CALL只发生和当其功能对象(通过名称提及或以其它方式)之后是括号中。

这是对所有有这个例子 - !请不要随意修改你的问题,在这里评论等,如果有,你仍然怀疑其他的一些具体方面

修改:所以OP评论说礼貌要求的 “关闭工厂” 更多的例子。这里有一个 - 想象一些抽象的一种GUI工具包的,而你要做的:

for i in range(len(buttons)):
  buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))

但是这不工作的权利 - 在ilambda是后期绑定的,所以在时间一个按钮点击被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)

这样你就可以采取的返回值,并调用它。

这是返回另一个函数的函数。 namevalue是返回的函数的参数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top