Python 3.x 我的函数参数如何确定返回几个嵌套函数中的哪一个?

Python 3.x 我的函数参数如何确定返回几个嵌套函数中的哪一个?,python-3.x,function,nested-function,Python 3.x,Function,Nested Function,我正在研究一个分层聚类问题,在这个问题上,可以使用几个指标来评估聚类质量(剪影分数、卡林斯基-哈拉巴斯指数和戴维斯-博尔丁指数)。 我已经成功地单独实现了这些指标,但为了方便起见,我想将它们合并为一个函数,get\u metrics 对于每个度量,其函数如下所示: get_Sils(min,max, data): .... return results 其中min和max是用于评估度量的聚类数,结果是其值的数组 我正在尝试以以下形式编写get_metrics(): get_me

我正在研究一个分层聚类问题,在这个问题上,可以使用几个指标来评估聚类质量(剪影分数、卡林斯基-哈拉巴斯指数和戴维斯-博尔丁指数)。 我已经成功地单独实现了这些指标,但为了方便起见,我想将它们合并为一个函数,
get\u metrics

对于每个度量,其函数如下所示:

get_Sils(min,max, data):
    ....
    return results
其中
min
max
是用于评估度量的聚类数,
结果
是其值的数组

我正在尝试以以下形式编写
get_metrics()

get_metrics(min, max, data, metric)
其中,
metric
的值指示是返回get_Sils、get_CalHars还是get_DBs

我尝试过使用if语句:

if metric = 'Sil':
    return get_sils(min, max, data)
elif metric = 'CalHar':
    return get_CalHars(min, max, data)
else metric = 'DB':
    return get_DBs(min, max, data)
但这似乎是一种低效的方法

我还尝试在get_metrics函数中定义每个度量函数:

def get_metrics(min, max, data, metric):
    _metric = metric
    def get_sils(min,max,data):
        # how to get_Sil        
        return results
    return _metric
get_metrics(min, max, data, metric='get_sils')
但这将返回一个字符串值
get\u sils


get\u metrics(min,max,data,'sils')
应返回与
get\u-sils(min,max,data)相同的值

只需在最后一个参数中传递函数本身,并按名称调用它即可

<define your functions>
def get_metrics(min, max, date, metric):
    return metric(min, max, date)

get_metrics(min, max, data, get_sils)

def get_指标(最小值、最大值、日期、指标):
返回指标(最小值、最大值、日期)
获取度量(最小、最大、数据、获取SIL)

函数是对象,可以作为参数传递。

此类问题的规范解决方案是使用dict将函数存储为值:

_METRICS = {}

# helper decorator, cf below
def register(key):
    def _register(func)
        _METRICS[key] = func
        return func
    return _register

@register("sils")
def get_Sils(...):
   # ...

@register("foo")
def get_foo(...)
   # ...

# etc

def get_metrics(min, max, data, funcname):
    func = _METRICS.get(funcname)
    if not func:
        raise ValueError("unknown funcname '{}'".format(funcname))
    return func(min, max, data)

哼那么,
get\u metrics
函数的作用是什么?用户也可以直接调用
get_sils(min,max,data)
它允许生成器表达式或列表理解等操作,根据提供的函数列表生成多个结果,以供评估。但是,如果函数定义对调用方是隐藏的,那么用字符串命名它们是合适的。我的意思是,在您当前的示例中,get_metrics函数只是一个完全无用的间接层次,我并不反对。很像问题中的原始函数。可能有一些更大的用途,这是一个最小的可重复的例子。好吧,原始的至少可以用来调用namen的有效函数,这对于ie的命令行工具来说是有意义的,你想让用户通过命令行开关来选择算法。这就是我想要做的,谢谢装饰师对我来说是一个新概念,所以我不知道怎么做。我会对它们做更多的阅读来理解它们。实际上,你不需要装饰程序,你可以手动构建dict。。。