python语法规范:typedargslist

时间:2018-01-10 05:30:38

标签: python-3.x bnf default-parameters

我正在检查python grammar specification,而python中的函数是使用BNF定义的。

funcdef: 'def' NAME parameters ['->' test] ':' suite

parameters: '(' [typedargslist] ')'
typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' [
        '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
      | '**' tfpdef [',']]]
  | '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
  | '**' tfpdef [','])
tfpdef: NAME [':' test]

问题出在这里:我认为python在默认参数之前不允许使用非默认参数,但显然BNF定义另有说明。我在python 3.5中检查过它会引发这样的错误。

    def my(c=1,a:1*2,*,b):
          ^
SyntaxError: non-default argument follows default argument

任何人都可以告诉我哪一个是对的吗?

1 个答案:

答案 0 :(得分:0)

Python确实不允许这样做。参见8.6 Function Definitions

  

如果参数具有默认值,则直到“ *”之前的所有后续参数也必须具有默认值-这是语法上没有表达的语法限制

(强调我的)