gpt4 book ai didi

python - 尝试在运行时在另一个函数内创建仅具有位置参数的函数后,会引发系统错误

转载 作者:行者123 更新时间:2023-12-01 00:11:43 25 4
gpt4 key购买 nike

有一些测试代码:

some_type = int

def func0():
def func1(arg: some_type, /):
pass

func0()

我收到以下错误:

Traceback (most recent call last): 
...
SystemError: no locals when loading 'some_type'

但是下面的代码可以按预期工作:

some_type = int

def func0():
def func1(arg: some_type):
pass

func0()

这也是有效的:

some_type = int
exec('''
def func1(arg: some_type, /):
pass
''')

我知道在未来的版本中,注释将不再在定义时被评估;也可以在 3.7+ 版本中激活此类行为。类似的东西

from __future__ import annotations
some_type = int

def func0():
def func1(arg: some_type, /):
pass

func0()

也没有问题。然而,问题是关于函数定义时当前的奇怪行为。 some_type 绝不是 func0 的局部变量,尽管 python 是这么认为的。又一个精美版本:

def func0():
some_type = int
def func1(arg: some_type, /):
pass

func0()

我已阅读 PEP 570但在那里没有找到任何有关注释声明的信息。

我的Python版本:

sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)

最佳答案

这是 cpython 中的一个错误——我在这里提出了一个问题:https://bugs.python.org/issue39215

查看这两个函数的反汇编,似乎在构建注释类型时错误地使用了 LOAD_NAME 而不是 LOAD_GLOBAL —— 这是与并且没有仅位置参数:

$ diff -u <(python3.9 -m dis t2.py | sed 's/0x[a-f0-9]*/0xdeadbeef/g;s/t2\.py/FILENAME/g') <(python3.9 -m dis t3.py | sed 's/0x[a-f0-9]*/0xdeadbeef/g;s/t3\.py/FILENAME/g')
--- /dev/fd/63 2020-01-04 16:34:27.372004436 -0800
+++ /dev/fd/62 2020-01-04 16:34:27.372004436 -0800
@@ -10,7 +10,7 @@
16 RETURN_VALUE

Disassembly of <code object f at 0xdeadbeef, file "FILENAME", line 1>:
- 2 0 LOAD_NAME 0 (int)
+ 2 0 LOAD_GLOBAL 0 (int)
2 LOAD_CONST 1 (('arg',))
4 BUILD_CONST_KEY_MAP 1
6 LOAD_CONST 2 (<code object g at 0xdeadbeef, file "FILENAME", line 2>)
<小时/>

编辑:这是一个修复此问题的拉取请求(如果我对时间的猜测正确的话,应该会出现在 3.8.2 和 3.9.0a3 中): https://github.com/python/cpython/pull/17826

关于python - 尝试在运行时在另一个函数内创建仅具有位置参数的函数后,会引发系统错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59594494/

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