如果标题含糊,我深表歉意。让我解释一下情况。
说我想根据某种分布生成一些随机数,它可以是统一的,正态的,泊松,二项式等。每个分布都有自己的参数/关键字参数来定义,例如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有关,还更多是与通用编程/语言无关的问题。
我觉得应该有一个简单,整洁的解决方案,而这现在让我望而却步。任何建议表示赞赏。
答案 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))