Python:何时应该命名要传递的参数?

时间:2018-07-19 17:43:06

标签: python

我最近一直在学习python,对于为什么人们在调用将参数命名为该函数的函数时为什么要命名参数感到有些困惑?

将此代码用于入门

std::list<std::unique_ptr<X>> xList;

一切看起来不错,但是有一部分我不明白。人们为什么指定他们分配给的参数名称?这就像惯例还是编写好的代码的规则?

为什么我们不能只写这个。

def my_funcation(greeting = 'Hello', name = 'Guest'):
    return f'{greeting}, {name}. How are you?'


print(my_function('Yo', name = 'Adam'))

IMO,第二个更好,以防参数名称更改。

3 个答案:

答案 0 :(得分:13)

有时,它会在代码中添加有用的上下文。

您想读什么:

enumerate('xyz', 120)  # err...what does that second arg do again?

enumerate('xyz', start=120)  # oh yeah, the start index

它允许您修改或重新排序函数的kwarg,而无需更改调用代码。

考虑在前面添加新参数:

def my_function(color='red', greeting='Hello', name='Guest'):
    ...

如果您还不修改调用方my_function('Yo', 'Adam'),则可以让他们现在填写不正确的参数-如果您没有很好的测试范围,您可能甚至在为时已晚之前都不会注意到该错误。

答案 1 :(得分:1)

如果您不想指定所有参数怎么办?

def my_function(greeting = 'Hello', name = 'Guest'):
    return f'{greeting}, {name}. How are you?'

print(my_function(name='ForceBru'))

没有此功能,您将无法仅在第二个参数之前指定它。


或者,如果您的函数有大量参数,该怎么办?

  1. 其中许多具有默认值
  2. 您不想弄乱函数声明
  3. 您希望函数调用反映您要传递的参数

那你怎么办?基本上是一样的东西:

def compute(stuff, **kwargs):
    be_fast = kwargs.get('be_fast')
    be_super_fast = kwargs.get('be_super_fast')

    if be_fast and be_super_fast:
        print('Activating turbo mode...')
    elif be_fast:
        print('Accelerating...')
    elif be_super_fast:
        print('Nobody can stop me!')
    else:
        print('I am a tortoise.')

    return stuff

然后您可以按以下方式调用它:

compute(1)
compute(1, be_fast=True)
compute(1, be_super_fast=True)
compute(1, be_fast=True, be_super_fast=True)

答案 2 :(得分:0)

如果您想说"Hello, Adam. How are you?"

您需要使用print(my_function(name = 'Adam'))

自使用

print(my_function('Hello', 'Adam'))

将是多余的。

  

IMO,第二个更好,以防参数名称更改。

在这种情况下是这样。但总的来说,我不会说更好,而是说不同