You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用ast.get_source_segment报错TypeError:Module对象无len()方法求助

Python AST获取If节点源码片段报错解决

问题代码

尝试解析包含if语句的Python代码并提取对应源码片段,代码如下:

import ast

tree = ast.parse("""

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def age_change(self):
        if(self.age>20):
            return self.age + 5
        else:
            return self.age

        """)

for node in ast.walk(tree):
    if(isinstance(node, ast.If)):
        print(ast.get_source_segment(tree, node))

报错信息

运行后触发TypeError:

Traceback (most recent call last):
  File "C:\Users\thoma\AppData\Roaming\JetBrains\PyCharmCE2020.3\scratches\scratch_21.py", line 20, in <module>
    print(ast.get_source_segment(tree, node))
  File "C:\Users\thoma\anaconda3\envs\torch_1\lib\ast.py", line 354, in get_source_segment
    lines = _splitlines_no_ff(source)
  File "C:\Users\thoma\anaconda3\envs\torch_1\lib\ast.py", line 307, in _splitlines_no_ff
    while idx < len(source):
TypeError: object of type 'Module' has no len()

报错原因

ast.get_source_segment()的第一个参数要求传入原始源代码字符串,而非ast.parse()返回的Module对象。代码中错误传入了tree(即Module实例),函数内部尝试对其调用len(),但Module类型不支持该操作,因此抛出错误。

解决方案

将原始源代码保存为独立变量,同时用于ast.parse()和ast.get_source_segment()的第一个参数。

修正后的代码

import ast

# 保存原始源代码字符串
source_code = """

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def age_change(self):
        if(self.age>20):
            return self.age + 5
        else:
            return self.age

        """

tree = ast.parse(source_code)

for node in ast.walk(tree):
    if isinstance(node, ast.If):
        # 传入原始源代码字符串而非Module对象
        print(ast.get_source_segment(source_code, node))

运行后会正确输出if语句的源码片段:

if(self.age>20):
    return self.age + 5
else:
    return self.age

内容的提问来源于stack exchange,提问作者desert_ranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:40:20