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 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'>]