强制关键字参数

时间:2018-09-19 13:27:40

标签: python

Python标准库中的某些函数具有(可选)关键字参数,但是以关键字参数形式使用它们是 optional ,例如。 G。

enumerate(iterable, start=1)    # as keyword argument

enumerate(iterabele, 1)         # as positional argument

都是正确的。

但是其他人明确禁止使用其可选的关键字参数作为位置e。 G。 sorted()

sorted(iterable, *, key=None, reverse=False)
   Return a new sorted list from the items in iterable.
   Has two optional arguments which must be specified as keyword arguments.

(另请参见PEP 3102 - Keyword-Only Arguments。)

为什么仅对几个关键字参数做出这样的决定?这种(不正确的)用法会带来什么后果:

sorted(strings_list, len, True)        # Incorrect, but why not allowed?

2 个答案:

答案 0 :(得分:3)

当然只能推测。 var data = [{ values: [1,1,0,4], labels: ['A', 'B', 'C', 'D' ], bgcolorsrc: ['#FAEBD7','#CDEFD7','#FAcFD7','#FAEBD7'], domain: { x: [0,1] }, name: 'Overall Status', hoverinfo: 'label+percent+name', hole: .6, type: 'pie' }]; var layout = { showlegend: true, visible:"legendonly", width:newWidth, height:newHeigth, paper_bgcolor: 'rgba(0,0,0,0)', plot_bgcolor: 'rgba(0,0,0,0)', font: { "color": "WHITE", "size": 13, "family": "Calibri", "bold": true }, hoverlabel: { bgcolor: 'transparent' }, legend :{ visible:true, orientation: 'h', x:0, y:0, tracetoggle: false , font:{ size:13 } }, margin: { l: 0, r: 1, t: 15, b: 0, pad: 0 }, interaction: ['toggle', 'isolate', false], point: { events: { legendItemClick: function () { return false; // <== returning false will cancel the //default action }, plotly_legendclick: function () { return false; // <== returning false will cancel the default //action } } }, annotations: [ { font: { size : 10 }, showarrow: false, text: ' ', x: 0.1, y: 0.2 } ] }; Plotly.newPlot('myDiv', data, layout); 在python 2.x中曾经具有不同的不同类型的参数。因此,很可能python 3.x版本会强迫您使用关键字参数作为新参数,以免意外地传递了在python 3中功能完全不同的python 2代码,而没有给出任何警告。

另一方面,这是例外,而不是规则。您提供的sorted示例没有什么特别的,它遵循标准的python规则。

答案 1 :(得分:2)

对于位置参数,您必须按照定义它们的顺序传递它们(让我们假设键,然后在此处反转...)。如果允许,则不进行键排序,但以相反的顺序进行排序,您必须编写:sorted(iterable, None, True) ...,如果您忘记了参数的顺序,并认为第一个参数是顺序,那么{{ 1}}会中断。

现在,您可以争辩说,您可以通过编写以下内容来避免显式的sorted(iterable, True)None ...在这种情况下,您最好强制使用仅关键字的参数以确保不会发生不幸这是sorted(iterable, reversed=True).sort的设计选择...

例如,如果参数没有逻辑顺序,那么sortedsorted作为第一个参数或key参数是否有意义。有人可能会争辩说,没有键的排序最有可能是常见的用例-因此reversed应该是第一个参数……您也可能会争辩说,由于升序是迄今为止最常用的排序顺序,因此{{ 1}}应该是第一个参数。

reversed为例-keyenumerate中的含义没有混淆-它始终是起始参数...您可以为它显式地提供一个名称。 ..

如有疑问,请对函数签名进行签名,以使每个参数都清晰可见,并避免可选位置参数可能引起的歧义。