[英]How does a (python) function process arguments?
我想知道由于Python中以下两个函数引起的两个错误,某种语言中的函数是如何处理的。
def fun(a=[0], b: int):
pass
该错误显示SyntaxError: non-default argument follows default argument
。
# to show that this function is not trivial
def fun(a:list=[0], b=len(a)):
pass
出现错误: NameError: name 'a' is not defined
显然在第一实施例显示, a
是之前处理b
,即是编译器应该知道a
当它遇到b
,但似乎并不所示第二示例中的编译器。
何时(或如何)在函数中定义参数? 或者我怎么知道引擎盖下发生了什么? 我的意思是编译器代码的相关部分,可以用上下文无关语法实现。
参数a
是一个局部变量,在函数运行之前实际上不会被定义; 它不能作为b
的默认参数值。 定义函数时需要存在这样的值。
第一个例子很明显,
a
在b
之前被处理
不是真的,至少不是“处理”的全部含义。
“编译器”/“预处理器”(这些术语中没有一个真正适用于 Python,但让我们使用它们)可以轻松检查是否在另一个参数之前使用=
和一个参数,而另一个参数没有它,只需构建 AST 树,无需“执行”实际代码。
因此, fun(a=0, b)
在语言语法级别是错误的(因此是Syntax Error
)。 它甚至在代码执行之前就被检测到,它的存在会停止代码的解析和“编译”。
fun(a=0, b=a)
在逻辑上是错误的。 语法检查机制不能/不会检测到它。 只有在解释器尝试执行代码时才会检测到它。
def fun(a=0, b):
在这里,您有一个默认值a
对,但没有b
。 这意味着您必须在调用函数时为b
提供一个值,而不是为a
提供一个值。 但是,当你这样称呼它时:
fun(42)
哪个参数将接收值? b
,既然a
已经有了?
该语法只会引发各种问题,因此您必须使用默认值last列出所有参数。 这就是该错误的原因。
def fun(a=0, b=a):
在这里,您尝试将变量a
的值分配为b
的默认值。 一般情况下没问题:
bar = 'baz'
def fun(foo=bar): ...
默认值在函数声明时计算一次。 的a
在b=a
决不确实指a
在a=0
从相同的函数声明。 它正在寻找范围内的变量a
,但它没有找到。
参数按照它们出现的顺序进行处理,但是如果您要为任何参数设置默认参数,那么它们需要放在最后。 正确的语法是def (b, a=0)
。 在这种情况下, b
是必需的参数, a
是可选的,如果没有传递任何内容,则默认为 0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.