【问题标题】:Python 3 best practice argument orderPython 3 最佳实践参数顺序
【发布时间】:2016-07-03 12:32:09
【问题描述】:

在这个question 中描述了从 Python3 开始你可以使用这个符号:

def func(a, b, *args, kw1=None, **kwargs)

定义一个函数,而不是传统的Python2方式:

def func(a, b, kw1=None, *args, **kwargs)

是否有任何公认的最佳实践,应该使用哪个签名,还是基于个人喜好?

【问题讨论】:

  • PEP-448 在 pyton 3.5.2 中实现带来更多变化

标签: python


【解决方案1】:

这里不可能有任何“最佳”实践,因为这两个定义意味着不同(在某种程度上,相反)的东西:

def func(a, b, kw1=None, *args, **kwargs):
    ...

意味着该函数将有一个可选的命名参数kw1,它可以作为关键字(func(1, 2, kw1=3))或作为位置参数(func(1, 2, 3))传递。 (事实上​​,除非用相对较新的/-syntax 明确指定,任何命名参数都可以作为关键字传递。)

但是,如果命名参数跟在*args(或只是*)之后,它可以作为关键字传递。例如:

def func(a, b, *, kw1=None, **kwargs):
    ...

不能称为func(1, 2, 3),并且有

def func(a, b, *args, kw1=None, **kwargs):
    print(a, b, kw1)

func(1, 2, 3) 将打印1, 2, None,因为位置参数转到*args 部分。 (感谢@tobias_k 指出这一点)。

【讨论】:

  • "cannot be called as func(1, 2, 3)" 可以,但是3 会转到args,而不是kw1
  • 你在第一个代码块之后混淆了“关键字”和“位置”
  • func(a, b, *,...)是什么语法?从来没有见过。可以提供参考吗?
  • @tobias_k 是PEP 3102'第二个语法变化是允许为可变参数省略参数名称。'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2018-01-31
  • 2011-02-12
  • 2016-09-25
  • 1970-01-01
  • 2018-05-10
  • 2011-09-24
相关资源
最近更新 更多