根据另一个参数的值设置功能参数

时间:2018-11-30 20:47:50

标签: python function parameter-passing

如果标题含糊,我深表歉意。让我解释一下情况。

说我想根据某种分布生成一些随机数,它可以是统一的,正态的,泊松,二项式等。每个分布都有自己的参数/关键字参数来定义,例如normal具有均值和std,Poisson具有lambda,uniform具有upper_bound和lower_bound,依此类推。如何定义此函数的签名,该签名应将分布类型作为字符串作为一个参数,并且取决于它的值,该函数应具有必需的(关键字)自变量,即均值和std等分布参数? / p>

def generate(distribution, params):
    """
    Args:
        distribution (str): can take values 'uniform', 'normal', 'poisson', etc.
        params (dict of str: float): based on the value of distribution, it should have the required parameters for the distribution
    """
    if distribution == 'uniform':
        result = uniform(params['lower'], params['upper'])
    elif distribution == 'normal':
        result = normal(params['mean'], params['std'])
    elif distribution == 'poisson':
        result = poisson(params['lambda'])
    elif ...:
        ...

我可以想到的一个选择是在签名中带有** kwargs,在其中可以直接插入关键字参数mean,std,lambda等。但这很混乱,并且不能反映给定分布的相关必需参数。我想知道用Python的方式可以做到这一点。

这只是一个示例,我的问题是,当某些参数依赖于其他与该函数相关的参数的值时,通常应该如何编写函数签名。这可能不仅与Python有关,还更多是与通用编程/语言无关的问题。

我觉得应该有一个简单,整洁的解决方案,而这现在让我望而却步。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用返回所需类型的函数的函数。像这样:

import random
def generate(dist):
    if dist == 'uniform':
        def uniformDist(lower=0, upper=1):
            return random.uniform(lower,upper)
        return uniformDist

    if dist == 'poisson':
        def poissonDist(lmbda=1,):
            return poisson(lmbda)
        return poissonDist

print(generate('poisson')(lmbda=3))
print(generate('uniform')(lower=34, upper=78))