【问题标题】:Python: pass function as parameter, with options to be setPython:将函数作为参数传递,并设置选项
【发布时间】:2013-03-27 08:22:20
【问题描述】:

在 Python 中,我需要在 相同的输入参数 sampleAsampleB 上调用许多非常相似的函数。唯一的问题是其中一些功能需要设置选项,而有些则不需要。 例如:

import scipy.stats
scipy.stats.mannwhitneyu(sampleA, sampleB)
[...some actions...]
scipy.stats.mstats.ks_twosamp(sampleA, sampleB, alternative='greater')
[...same actions as above...]
scipy.stats.mstats.mannwhitneyu(sampleA, sampleB, use_continuity=True)
[...same actions as above...]

因此,我想将这些函数的名称作为更通用函数 computeStats 以及 sampleAsampleB 的输入参数传递,但我不知道如何处理我有时会遇到的选项必须使用。

def computeStats(functionName, sampleA, sampleB, options???):
   functionName(sampleA, sampleB)  #and options set when necessary
   ...some actions...
   return testStatistic

如何指定有时必须设置、有时不需要设置的选项?

【问题讨论】:

    标签: python function parameters


    【解决方案1】:

    使用**kwargs:

    def computeStats(func, sampleA, sampleB, **kwargs):
       func(sampleA, sampleB, **kwargs)
       ...some actions...
       return testStatistic
    

    然后你就可以像这样使用computeStats()了:

    computeStats(scipy.stats.mstats.ks_twosamp, sampleA, sampleB, alternative='greater')
    

    也就是说,我并不完全相信你需要这个。简单点怎么样

    def postprocessStats(testStatistic):
       ...some actions...
       return testStatistic
    
    postprocessStats(scipy.stats.mstats.ks_twosamp(sampleA, sampleB, alternative='greater'))
    

    ?

    我认为这更容易阅读,同时也更通用。

    【讨论】:

    • 哈!最后的解决方案很酷!至于**kwargs,当我不指定它时,我猜它只是None,我可以将它作为没有副作用的参数传递,对吧?
    • @RickyRobinson:使用**kwargs 时可以不指定参数。你只会得到一个空字典,一切都会按预期工作。
    • 请注意,在**kwargs(和*args)中,名称只是约定。重要的是the * and the **
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 2021-04-13
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多