2017-02-23 113 views
0

我想知道是否有这种“链式”命名参数的最佳做法或惯例。我试图将第一个变量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

在'foo'中,您正在调用'test()'。那应该是'bar()'? – MakPo

+1

也为什么dose'foo'有一个'b'参数,如果它没有被使用? – MakPo

+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) 
0

任何这里的答案是主观的,但我不打算提交关闭的问题,因为我觉得这是一个任何人学习Python和专业实践价值。

说了那么,我认为你的方式是正确的,如果bfoo被假定为在调用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) 

现在,这变得更加清晰,我们可以预见期望的结果应该是什么。我们还节省了大量的时间来阅读代码,并且将结果与调试器中的函数进行比较(与预期的结果相比),而不必进入并逐行阅读。