【问题标题】:Pass object method as lambda or partial function, replacing self parameter with target object?将对象方法作为 lambda 或部分函数传递,用目标对象替换 self 参数?
【发布时间】:2017-04-06 19:15:23
【问题描述】:

用例:假设我有一组非常大的 Pandas Series 对象,我希望将.drop_na() 方法应用于所有对象。然而,因为它们太大了,我必须使用一个函数来通过multiprocessing 执行此操作,方法是接受对象列表并将列表中的每个对象用作方法的参数(也作为对象传递)。

鉴于对象方法的第一个隐含参数是 self。

我可以使用 lambda、partial 或其他技巧来传递 .drop_na() 方法并将 .drop_na() 中的 self 参数替换为系列的特定实例吗?这在 Python 中可行吗?

【问题讨论】:

    标签: python python-3.x lambda partials


    【解决方案1】:

    是的。第一个参数仅在方法绑定到使用. 表示法的类实例的对象时才“隐式”,例如

    sr = Series(...)
    sr.drop_na()
    

    在这种情况下,sr.drop_na 实际上是一个闭包,它将Series.drop_naself 参数替换为对sr 的引用,有点像

    lambda: Series.drop_na(sr)
    

    您始终可以直接从类中调用方法并显式传递self 参数。上面的例子可以改写为:

    sr = Series(...)
    Series.drop_na(sr)
    

    您可以根据需要传递函数Series.drop_na,并在您需要的任何对象上调用它。请注意,Series.drop_na 采用单个参数,而 sr.drop_na 没有。

    这不是诡计,实际上是在语言中经过深思熟虑的设计选择,旨在用于像您这样的案例(以及许多其他案例)。

    【讨论】:

    • 谢谢。我觉得python中的闭包讨论得还不够。
    • 是的,规则有时可能有点晦涩难懂。这个特别的非常简单,但我花了很长时间才意识到,每次通过对象上的. 访问方法时都会创建一个 不同的 闭包:stackoverflow.com/q/41900639/2988730
    • Nitpick: sr.drop_na 是闭包; sr.drop_na() 是将闭包应用于其剩余的必需参数(其中没有)。
    • @chepner。不错的收获,已修复。
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2018-02-23
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多