繁体   English   中英

(python) 函数如何处理参数?

[英]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的默认参数值。 定义函数时需要存在这样的值。

第一个例子很明显, ab之前被处理

不是真的,至少不是“处理”的全部含义。

“编译器”/“预处理器”(这些术语中没有一个真正适用于 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): ...

默认值在函数声明时计算一次。 ab=a决不确实指aa=0从相同的函数声明。 它正在寻找范围内的变量a ,但它没有找到。

参数按照它们出现的顺序进行处理,但是如果您要为任何参数设置默认参数,那么它们需要放在最后。 正确的语法是def (b, a=0) 在这种情况下, b是必需的参数, a是可选的,如果没有传递任何内容,则默认为 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM