跳到内容

llmcompressor.pipelines.sequential.ast_utils.name_analyzer

  • NameAnalyzer

    确定与一段代码关联的未绑定、已分配和有条件分配的名称。

NameAnalyzer

NameAnalyzer(omit: Set[str])

基类:NodeVisitor

确定与一段代码关联的未绑定、已分配和有条件分配的名称。此信息用于确定包装函数(wrapper function)的参数和返回值。

例如,对于以下代码段:

b = a + 1
if some_condition:
    c = 5

a 是未绑定的,意味着它必须是包装函数的输入。 b 是已分配的,意味着它必须是包装函数的输出。 c 是有条件分配的,意味着它必须是包装函数的输出,并且 *可能* 是输入,如果 c 已经存在于命名空间中。

请注意,在读取之前被赋值的名称不被视为未绑定。

a = 2  # no longer unbound
b = a + 1

方法

  • analyze

    分析给定代码段中名称的使用情况。

源代码位于 llmcompressor/pipelines/sequential/ast_utils/name_analyzer.py
def __init__(self, omit: Set[str]):
    self._omit = builtins.__dict__.keys() | omit

analyze

analyze(node: AST) -> Tuple[Set[str], Set[str], Set[str]]

分析给定代码段中名称的使用情况。

参数

  • 节点

    (AST) –

    要分析的代码。 返回:未绑定名称、已分配名称和有条件分配名称的元组。

源代码位于 llmcompressor/pipelines/sequential/ast_utils/name_analyzer.py
def analyze(self, node: ast.AST) -> Tuple[Set[str], Set[str], Set[str]]:
    """
    Analyzes the use of names in the given piece of code

    :param node: code to analyze
    return: tuple of unbound names, assigned names, and conditionally assigned names
    """
    self._unbound = set()
    self._assigned = set()
    self._conditionally_assigned = set()
    self.visit(node)

    return self._unbound, self._assigned, self._conditionally_assigned