真,大多数编程语言使函数调用合同参数顺序的一部分,但这并不需要如此。为什么呢?那么我对这个问题的理解是,Python在这方面与其他编程语言有什么不同。除了其他很好的答案为Python 2,请考虑以下因素:
__named_only_start = object()
def info(param1,param2,param3,_p=__named_only_start,spacing=10,collapse=1):
if _p is not __named_only_start:
raise TypeError("info() takes at most 3 positional arguments")
return str(param1+param2+param3) +"-"+ str(spacing) +"-"+ str(collapse)
的唯一途径呼叫者将能够提供论据spacing
和collapse
位置上(无例外)将是:
info(arg1, arg2, arg3, module.__named_only_start, 11, 2)
不使用属于其他模块的私有元素的惯例在Python中已经非常基本。与Python本身一样,这个参数约定只会被强制执行。
否则,呼叫将需要的形式为:
info(arg1, arg2, arg3, spacing=11, collapse=2)
呼叫
info(arg1, arg2, arg3, 11, 2)
将会分配值11参数_p
和函数的第一个指令上升异常。
特点:
- 参数之前
_p=__named_only_start
在位置录取(或名称)。
_p=__named_only_start
之后的参数必须仅以名称提供(除非获得并使用有关特殊哨兵对象__named_only_start
的知识)。
优点:
- 参数在数量和意义(后来的,如果好名字也选择了,当然)明确。
- 如果将sentinel指定为第一个参数,则所有参数都需要通过名称指定。
- 调用该功能时,可以通过在相应的位置使用标记对象
__named_only_start
来切换到位置模式。
- 可以预期比其他替代方案更好的性能。
缺点:
检查在运行时发生,而不是编译时。
- 使用额外的参数(尽管不是参数)和额外的检查。对常规功能的性能下降很小。
- 功能性是没有语言直接支持的黑客(见下面的注释)。
- 调用该功能时,可以通过在正确位置使用哨兵对象
__named_only_start
来切换到位置模式。是的,这也可以看作是一个专业人士。
请记住,这个答案只适用于Python 2. Python 3实现了其他答案中描述的类似但非常优雅的语言支持机制。
我发现,当我打开思绪想一想,没有问题或其他的决定似乎愚蠢,愚蠢或愚蠢。恰恰相反:我通常学到很多东西。
对于寻找他的引用来源的人来说,它在Python 3文档中:https://docs.python.org/3.5/reference/compound_stmts.html#function-definitions – phoenix 2015-08-10 21:30:38
使用** kwargs:'def foo( pos,*,forcenamed,** kwargs)'。 – Jerther 2017-11-27 19:44:56