gpt4 book ai didi

由于 UnboundLocalError 无法调用 Python3 方法

转载 作者:行者123 更新时间:2023-12-04 07:15:59 25 4
gpt4 key购买 nike

考虑以下代码:

def main():
print('Calling methodA()')
methodA()

print('Calling methodB(True)')
methodB(True)

print('Calling methodB(False)')
try:
methodB(False)
except UnboundLocalError as error:
print(f'--> "UnboundLocalError" raised: {error}')

def methodA():
print('Running methodA()')
print('"method_original" in globals(): ' + str('method_original' in globals()))
method_original()

def methodB(patch_function):
print(f'Running methodB({patch_function})')
print('"method_original" in globals(): ' + str('method_original' in globals()))
if patch_function:
method_original=method_patched
method_original()

def method_original():
print('Running method_original()')

def method_patched():
print('Running method_patched()')

if __name__ == '__main__':
main()
它产生以下输出:
Calling methodA()
Running methodA()
"method_original" in globals(): True
Running method_original()
Calling methodB(True)
Running methodB(True)
"method_original" in globals(): True
Running method_patched()
Calling methodA(False)
Running methodB(False)
"method_original" in globals(): True
--> "UnboundLocalError" raised: local variable 'method_original' referenced before assignment
这是没有意义的,因为“method_original”在 globals() 中。只需添加 global method_original 即可修复此错误开头的 methodB()但在某些情况下,我们有很多函数,将它们全部放在每个方法的开头可能会很麻烦。
是否有任何规则可以避免这种行为?
//BR!

最佳答案

让我用一个更简单的例子来解释它:

def fn(a):
if a % 2 == 0:
x = a
return x

print(fn(10)) # Fine
print(fn(9)) # UnboundLocalError: local variable 'x' referenced before assignment
在编译时,当解释器到达函数时,它看到对 x 的赋值。 ,所以它标记 x作为“本地”变量。然后在“运行时”解释器尝试仅在本地命名空间中找到它!另一方面, x仅定义,如果 a甚至。
它是否出现在全局命名空间中并不重要,现在我想添加一个名为 x 的全局变量,以我为例:
def fn(a):
if a % 2 == 0:
x = a
return x

x = 50


print(fn(10)) # Fine
print(fn(9)) # UnboundLocalError: local variable 'x' referenced before assignment
没有改变。解释器仍然试图找到 x 本地命名空间中的函数。
同样的事情发生在你的例子中。
这是为了显示哪些变量是“本地”的:
def fn(a):
if a % 2 == 0:
x = a
return x

print(fn.__code__.co_varnames)

co_varnames is a tuple containing the names of the local variables(starting with the argument names)



解决方案:
要么使用 global (我看到你不喜欢),或者不要在函数内部进行赋值,例如更改您的 methodB到 :
def methodB(patch_function):
print(f'Running methodB({patch_function})')
print('"method_original" in globals(): ' + str('method_original' in globals()))
if patch_function:
method_patched()
else:
method_original()

关于由于 UnboundLocalError 无法调用 Python3 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68759815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com