我想知道这种"链接"是否有最佳实践或约定。命名参数。我正在尝试将第一个变量d
传递给bar
到foo
。以这种方式做到这一点有点尴尬,我相信应该有一个更聪明的方法,但今天看完大量的文件仍然没有线索。
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)
答案 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
现在变得更加清晰,我们可以预测到预期结果应该是什么。我们还节省了很多时间来阅读代码,并且有一个结果可以与调试器中的函数进行比较(给定预期)而不必进入并逐行读取它。