Python 尝试在运行时在另一个函数内创建仅包含位置参数的函数后引发SystemError

Python 尝试在运行时在另一个函数内创建仅包含位置参数的函数后引发SystemError,python,function,annotations,python-3.8,positional-parameter,Python,Function,Annotations,Python 3.8,Positional Parameter,有一些测试代码: 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 func

有一些测试代码:

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()
我读过,但没有找到任何关于注释和声明的内容

我的python版本:

sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
这是cpython中的一个bug--我在这里为它打开了一个问题:

从这两个函数的反汇编来看,在构建注释类型时,它似乎错误地使用了
LOAD\u NAME
而不是
LOAD\u 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>)

$diff-u在我看来,这很可能是python中的一个bug。。。在仅位置运算符之后添加类型为的参数也将“修复”问题,
def func1(arg:some_type,/,bar:some_type)
(如果未提供键入,则错误仍然存在)您是对的。似乎
LOAD\u DEREF