我想知道是否有这种“链式”命名参数的最佳做法或惯例。我试图将第一个变量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)
我想知道是否有这种“链式”命名参数的最佳做法或惯例。我试图将第一个变量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)
我不认为有这样做的更好的办法,但如果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)
任何这里的答案是主观的,但我不打算提交关闭的问题,因为我觉得这是一个任何人学习Python和专业实践价值。
说了那么,我认为你的方式是正确的,如果b
在foo
被假定为在调用bar
之后的函数中的一行代码中被使用。如果不使用b
,则应将其从参数列表中删除。
但让我再做一个案例,而我们是主观性的:尽可能使用关键字参数在函数调用时指定参数。
为什么?
因为当你在专业环境中查看复杂的代码时,它变得更加清楚传递给函数的原因和原因。在Python中,显式优于隐式。
您将编写一次代码。你可以纠正它几次。有人会读你的代码来处理一千次的生产问题。
例如下面的代码(这是一个财务模型)采取:
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)
将手放在函数定义的参数列表。你能分辨出每个数字代表什么吗? 当然,您可以在同一个文件中找到定义并比较位置参数,但如果black_scholes()
在另一个模块中呢?现在它有点强硬。如果我们扩大了这个范围,并且在black_scholes()
和之间添加了更高级别的包装,那么我们需要调试才能达到这个目的?
现在,让我告诉你有关键字参数的函数调用:
result = black_scholes(spot=44, strike=48, volatility=.08, risk_free_rate=.54, expiry=.75)
现在,这变得更加清晰,我们可以预见期望的结果应该是什么。我们还节省了大量的时间来阅读代码,并且将结果与调试器中的函数进行比较(与预期的结果相比),而不必进入并逐行阅读。
在'foo'中,您正在调用'test()'。那应该是'bar()'? – MakPo
也为什么dose'foo'有一个'b'参数,如果它没有被使用? – MakPo
抱歉错别字...修正了它。 –