【问题标题】:named parameter passing multiple times命名参数多次传递
【发布时间】:2017-07-13 06:50:12
【问题描述】:

我想知道这种“链式”命名参数是否有最佳实践或约定。我正在尝试通过foo 将第一个变量d 传递给bar。这样做有点尴尬,我相信应该有更聪明的方法,但今天翻阅了大量文件后仍然没有任何线索。

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)

【问题讨论】:

  • foo 中,您正在调用test()。应该是bar()
  • 如果不使用foo,为什么还要有b 参数?
  • 抱歉错字...已修正。
  • 在某些情况下,一种语言应该需要明确的文本来表达正在发生的事情。这是一。我使用的语言使调用者的参数在被调用者中可用。这或多或少是一场灾难。如果你的意思是传递一个地图,那么传递一个(散列)地图。
  • foob 作为参数只是一个假设,函数中应该有许多其他变量用于其他情况。谢谢!

标签: python named-parameters


【解决方案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)

【讨论】:

    【解决方案2】:

    这里的任何答案都是主观的,但我不会提交来结束这个问题,因为我认为这对任何学习 Python 和专业实践的人都很有价值。

    话虽如此,我认为您的方式是正确的,如果在调用bar 后假定在函数内的一行代码中使用foo 中的b。如果不使用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)
    

    现在这变得更加清晰,我们可以预测预期的结果应该是什么。我们还节省了大量阅读代码的时间,并且通过在调试器中单步执行函数而不是进入它并逐行读取它,得到了与(给定预期的)结果进行比较的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2018-07-29
      • 1970-01-01
      • 2012-04-25
      • 2015-03-03
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多