python符号可以在同一范围内是全局和局部的

python符号可以在同一范围内是全局和局部的,python,global-variables,symbols,Python,Global Variables,Symbols,考虑这一功能: def content(path): global file # not useful but valid with open(path) as file: return file.read() 当使用模块symtable生成符号表并检查函数内容范围内的符号文件时,它同时是全局和局部的。调用此函数后,全局名称文件将绑定到文件对象。所以我想知道为什么函数范围中的符号文件也被视为本地符号 下面是复制行为的代码,将其放入一个文件中,例如称为global_和_local

考虑这一功能:

def content(path):
  global file # not useful but valid
  with open(path) as file:
    return file.read()
当使用模块symtable生成符号表并检查函数内容范围内的符号文件时,它同时是全局和局部的。调用此函数后,全局名称文件将绑定到文件对象。所以我想知道为什么函数范围中的符号文件也被视为本地符号

下面是复制行为的代码,将其放入一个文件中,例如称为global_和_local.py:

生成以下输出:

symbol 'file' in function scope: is_global() = True
symbol 'file' in function scope: is_local() = True
global scope: file = <_io.TextIOWrapper name='global_and_local.py' ...>
出于某种原因,symtable是局部的,用于检查符号的任何绑定操作是否发生在范围或注释中,在本阶段,这些操作与注释赋值一起集中在一起:

def is_local(self):
    return bool(self.__flags & DEF_BOUND)
而不是检查符号是否实际是本地的

def is_local(self):
    return bool(self.__scope in (LOCAL, CELL))
我不知道为什么。这可能是个bug。我认为这样的模块没有多大用处-在任何人添加//运算符破坏旧的解析器模块之前,我很容易看到这一点没有被注意到。

出于某种原因,symtable是一种局部检查,用于检查符号的任何绑定操作是否发生在范围或注释中,在本阶段,这些作业与带注释的作业集中在一起:

def is_local(self):
    return bool(self.__flags & DEF_BOUND)
而不是检查符号是否实际是本地的

def is_local(self):
    return bool(self.__scope in (LOCAL, CELL))

我不知道为什么。这可能是个bug。我认为这样的模块没有多大用处-在任何人添加//运算符破坏旧的解析器模块之前,我可以很容易地看出这一点没有引起注意。

@coproc:Assignment、函数定义、导入、用作for循环目标,我已经提交了一份bug报告,请参阅并参考您的答案symtable.Symbol.is_local现在已修复:啊,哎呀。Python/symtable.c处理CELL的方式与其他作用域稍有不同,所以我没有意识到它是一个独立于LOCAL的选项。我很确定bool是冗余的,尽管它在其他一些执行&的方法中并不是冗余的。我很高兴有人发现了这一点,所以我们并不是从一个bug转到另一个bug。@coproc:Assignment,function definitions,imports,用作for循环目标,我已经提交了一份bug报告,请参阅并参考您的答案symtable.Symbol.is_local现在已修复:啊,哎呀。Python/symtable.c处理CELL的方式与其他作用域稍有不同,所以我没有意识到它是一个独立于LOCAL的选项。我很确定bool是多余的,尽管它在其他一些执行&的方法中不是多余的。我很高兴其他人发现了这一点,所以我们并不是从一个bug转到另一个bug。