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?
答案 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
的设计选择...
例如,如果参数没有逻辑顺序,那么sorted
将sorted
作为第一个参数或key
参数是否有意义。有人可能会争辩说,没有键的排序最有可能是常见的用例-因此reversed
应该是第一个参数……您也可能会争辩说,由于升序是迄今为止最常用的排序顺序,因此{{ 1}}应该是第一个参数。
以reversed
为例-key
在enumerate
中的含义没有混淆-它始终是起始参数...您可以为它显式地提供一个名称。 ..
如有疑问,请对函数签名进行签名,以使每个参数都清晰可见,并避免可选位置参数可能引起的歧义。