检查帧的代码对象
co_freevars
,它是代码对象使用的闭包变量名称的元组:
def is_nonlocal(frame, varname):
return varname in frame.f_code.co_freevars
请注意,这是一个闭包变量,它是
nonlocal
语句查找。如果要包含所有非本地变量,则应检查
co_varnames
(内部范围中未使用局部变量)和
co_cellvars
(内部作用域中使用的局部变量):
def isnt_local(frame, varname):
return varname not in (frame.f_code.co_varnames + frame.f_code.co_cellvars)
另外,不要把事情搞混了
co_names
,这是目前的错误记录。这个
inspect
博士说
科名
用于局部变量,但
科名
是一种“其他一切”的垃圾箱。它包括全局名称、属性名称和导入中涉及的几种名称——大多数情况下,如果预期执行实际上需要名称的字符串形式,则它将进入
科名
.