命名参数多次传递

时间:2017-02-23 00:13:43

标签: python named-parameters

我想知道这种"链接"是否有最佳实践或约定。命名参数。我正在尝试将第一个变量d传递给barfoo。以这种方式做到这一点有点尴尬,我相信应该有一个更聪明的方法,但今天看完大量的文件仍然没有线索。

def bar(a=0, b=0, c=0, d=0):
    print(a,b,c,d)

def foo(b=0,d=0):
    bar(d=d)

foo(d=1)
#(0,0,0,1)

2 个答案:

答案 0 :(得分:0)

我认为没有更好的方法可以做到这一点,但如果b参数不会在foo()中使用,那么我就不会在那里使用它。

def bar(a=0, b=0, c=0, d=0):
    print(a,b,c,d)

def foo(d=0):
    bar(d=d)

foo(1)
#(0,0,0,1)

答案 1 :(得分:0)

这里的任何答案都是主观的,但我不打算接受这个问题,因为我觉得这对于学习Python和专业练习的人来说很有价值。

话虽如此,我认为如果b中的foo假定在调用bar后函数内的一行代码中使用b,那么我认为你的方法是正确的。如果未使用def black_scholes(spot, strike, volatility, risk_free_rate, expiry=.25): # do calculation and return result # .... return result option_value = black_scholes(44, 48, .08, .54, .75) ,则应将其从参数列表中删除。

但是,在我们处于主观性时,让我再提出一个案例:尽可能使用关键字参数在函数调用中指定参数

为什么呢?

因为当您在专业环境中查看复杂代码时,将更清楚地传递给函数的原因以及原因。在Python中,显示优于隐式

您将编写一次代码。你可能会纠正它几次。有人会读你的代码来处理生产问题一千次。

以下面的代码(这是一个财务模型)为例:

black_scholes()

将手放在功能定义中的参数列表中。你能说出这些数字代表什么吗? 当然,你可以在同一个文件中找到定义并比较位置参数,但是如果black_scholes()在另一个模块中呢?现在它有点困难了。如果我们对此进行了扩展并在result = black_scholes(spot=44, strike=48, volatility=.08, risk_free_rate=.54, expiry=.75) 周围添加了更高级别的包装器,那么<​​/ em>我们必须调试什么来实现这一目标呢?

现在,让我用关键字参数向您展示函数调用:

    let image = UIImage(named: "noFoldersImage")
    let iv = UIImageView(image: image)
    iv.contentMode = .scaleAspectFit
    iv.layer.frame = CGRect(x: self.view.frame.midX, y: self.view.frame.midY, width: 200, height: 200)
    let tableViewBackgroundView = UIView()
    tableViewBackgroundView.addSubview(iv)
    self.tableView.backgroundView = tableViewBackgroundView

现在变得更加清晰,我们可以预测到预期结果应该是什么。我们还节省了很多时间来阅读代码,并且有一个结果可以与调试器中的函数进行比较(给定预期)而不必进入并逐行读取它。