当我在 Python 3.8 中使用带有注释的仅位置参数时,我得到一个似乎不正确的符号表

问题描述 投票:0回答:1

Python 3.8 对于仅位置函数参数有一个新的语法功能。当我结合注释使用此功能并为代码生成符号表时,似乎缺少一个符号。

没有仅限位置的参数:

>>> import symtable
>>> symtable.symtable('def f(x: y): pass', '?', 'exec').get_symbols()
[<symbol 'f'>, <symbol 'y'>]

这是预料之中的。

f
y
是全局范围内的符号。现在我添加一个
/
来标记参数仅位置:

>>> symtable.symtable('def f(x: y, /): pass', '?', 'exec').get_symbols()
[<symbol 'f'>]

这似乎是错误的。 符号

y
丢失了,尽管它仍然是
x
的注释,因此应该仍然存在于根符号表中。这是一个内部错误,还是我错过了这个新功能的副作用?

(我正在使用 CPython 3.8.0。)

python python-internals python-3.8
1个回答
0
投票

这已在 Python 3.8.x 中修复(无法计算出确切的版本平分)和所有稳定的 3.9~3.12 版本,因此不再是问题。

❯❯❯ python3.8 -c "import sys, symtable; print(sys.version.split()[0], symtable.symtable('def f(x: y, /): pass', '?', 'exec').get_symbols())"
3.8.18 [<symbol 'f'>, <symbol 'y'>]

❯❯❯ python3.9 -c "import sys, symtable; print(sys.version.split()[0], symtable.symtable('def f(x: y, /): pass', '?', 'exec').get_symbols())"
3.9.18 [<symbol 'f'>, <symbol 'y'>]

❯❯❯ python3.10 -c "import sys, symtable; print(sys.version.split()[0], symtable.symtable('def f(x: y, /): pass', '?', 'exec').get_symbols())"
3.10.13 [<symbol 'f'>, <symbol 'y'>]

❯❯❯ python3.11 -c "import sys, symtable; print(sys.version.split()[0], symtable.symtable('def f(x: y, /): pass', '?', 'exec').get_symbols())"
3.11.5 [<symbol 'f'>, <symbol 'y'>]
© www.soinside.com 2019 - 2024. All rights reserved.