最近从Copilot转到了Cursor,想试试Claude写代码的效果。但用了一个礼拜,发现它写Python flask接口的时候,特别喜欢自作主张给我加一些根本用不到的import,比如from typing import Optional、List这些,明明我代码里根本没用到。有时候还会把requests库和httpx混着import,搞得我每次合并代码都要删一堆。想问下各位老哥,是不是我的prompt写得不对?还是说Cursor的context模式要调一下?或者这个就是Claude的通病?我是用的默认的agent模式,工程是FastAPI + SQLAlchemy。有没有办法让它更“克制”一点,别老给我加这种“保险”import?
Cursor写Python后端代码,总给我加一些没用的import,怎么调教?
全部回复
共 166 条这问题我也遇到过,感觉不是prompt的事,主要是Claude对类型标注有执念,总想“帮”你补全。你在Agent模式里加一句“禁止添加未使用的import”试试,或者直接把system prompt改成“只修改调用处,不新增任何导入”。另外,把Auto-Import这类补全功能关掉,能少一半麻烦。
在rules里加一条“不要添加未使用的import”,比调prompt管用,我试过立马老实了。
Cursor的agent模式确实爱炫技,把system prompt里加上“保持最小改动”试试,副作用少很多。
这问题太真实了,Claude写代码确实有这种“过度防御”的习惯。我试过在系统提示里加一句“只导入当前文件实际使用的模块”,能稍微收敛一点,但偶尔还是会抽风。另外你检查下agent模式是不是开了auto,有时候它为了“保险”会预判后续要用的类型注解。建议把rules文件里写清楚禁止冗余import,再配合code review,基本能治住。
我猜不是你prompt的问题,这模型天生爱堆类型提示,尤其FastAPI项目里它总觉得你要用Optional。你可以试试在项目根目录放个.claude文件,明确写“禁止导入未使用的typing模块”,效果立竿见影。不过说实话,每次合并前用ruff自动清理一下其实更快,习惯就好。
我倒是觉得这个跟context模式关系不大,主要是Claude的生成策略偏“完备性”。你试试在提问时带上一句“保持最小依赖,只加运行必需的import”,它会在生成时更保守。另外,如果它老混requests和httpx,可能是你历史代码里两种都出现过,建议把项目里统一成一种,它学习上下文后会收敛。
我遇到过一模一样的情况,后来发现是默认的agent会参考整个文件的历史修改记录。你可以在对话里明确说“基于当前代码状态,不要推测未来需求”,然后每次提交前用IDE的organize imports一键清理。别
这问题我太有同感了,Claude写代码就是爱给自己加戏。你可以试试在项目根目录放个.claude的规则文件,明确写上“只import代码中实际使用的模块”,能压住不少。另外把agent模式改成normal或者直接关掉自动补全,只让它改你选中的代码块,会克制很多。还有个偏方,每次让它写之前加一句“禁止引入任何未直接调用的模块”,虽然不能100%杜绝,但至少能少删一半。
我跟你一模一样,从Copilot切过来第一周差点被这毛病逼疯。后来发现其实问题不在Claude本身,而是Cursor的agent模式太“主动”了,它会自动脑补你接下来可能要用的类型注解和工具库。你可以试试把agent模式切成normal或者直接开个新对话,然后在系统prompt里加一句“只在代码运行报错时补充import,不要预判性添加”,效果立竿见影。还有个土办法,写完接口后让Claude自己跑一遍lint,它看到未使用的import报错就会主动删掉。另外requests和httpx混着import这个确实挺头疼,我怀疑是训练数据里常见这俩一起出现,你可以在项目里配个.editorconfig或者用ruff的规则强制统一。说实话我后来还是保留了Copilot写Python,Cursor只用来写前端和重构,各有各的擅长吧。
这问题我也遇到过,尤其是从Copilot切过来的时候特别明显。后来我发现把agent模式改成普通chat模式,然后prompt里明确写一句“只导入实际用到的模块,不要添加任何未使用的import”,效果会好一些。另外你可以试试在项目根目录加个.claude文件,专门约束代码风格,比每次对话都强调省事多了。不过说实话,Claude这毛病确实比Copilot顽固,偶尔还是会犯,删就完了,别太指望它完全改掉。
这问题我也遇到过,后来发现跟模型关系不太大,主要是agent模式下它老爱预判你后面要干啥。你可以试试在系统prompt里加一条“只import当前代码里明确用到的模块”,或者把上下文调成strict模式,能收敛不少。另外FastAPI项目建议把pyright或者ruff的自动修复打开,合代码前跑一遍自动清理,比手动删省心多了。
在规则里加一条“不要新增未使用的import”试试,我这么干之后清净多了。
这问题太真实了,Claude确实有这毛病,尤其写FastAPI的时候特别喜欢把能想到的类型全import一遍。我试过在系统提示里加一句“只导入代码中实际使用的模块”,能好一点,但还是偶尔犯病。另外你试试把agent模式改成normal,别让它太“自主”,它那种“未雨绸缪”式的补全逻辑会收敛很多。不过说实话,这跟Copilot那种保守风格比确实烦人,我现在都养成习惯了,合并前先跑一遍ruff自动清理未使用的import。
试试在系统提示里加一句“只引入实际使用的依赖”,虽然不能根治,但能少删一半。
在agent模式下prompt里明确写“只改必要代码,禁止添加未使用的import”,试两天效果立竿见影。
把agent模式换成normal编辑模式,它就不那么爱自作主张了,我试过有效。
这个我太有同感了,Claude写Python确实爱加一堆类型注解的import,感觉是它训练时养成的习惯。你试试在系统prompt里加一句“只在代码实际使用到该类型时才导入”,或者把context模式调成strict试试。另外我这边把自动补全的延迟调高了点,它就没那么急着“帮忙”了,你可以观察下是不是这个触发时机的问题。
试试在系统提示里写死“禁止添加未使用的import”,我这么干之后干净多了,不过偶尔还是得盯一眼。
Cursor对Claude的上下文理解确实有点过度,把项目里出现过的库都当备选,你可以在rules里加一条“只import当前文件用到的”。
试试在系统prompt里写死“禁止添加未使用的import”,我这么干之后干净多了,不过偶尔还是会犯病。
试试在system prompt里写死“禁止添加未使用的import”,比context模式管用,我调完清净多了。
试试在系统提示里加一句“只导入代码实际用到的模块”,实测能少很多无效import。
这个问题我太有共鸣了,从Copilot切过来第一个月差点被它这个“热情”整崩溃。后来我发现Claude写Python就是有这种“防御性编程”的癖好,它觉得加上Optional和List显得类型严谨,但其实根本不看你的函数体里有没有用到。后来我试了个土办法,在项目根目录放一个.CLAUDE.md文件,里面直接写清楚“不要导入未使用的类型,不要同时引用requests和httpx,优先用当前项目已有的依赖”,效果立竿见影。另外把agent模式从默认改成“focus”或者自己写一个专门的代码生成指令模板,也能让它收敛很多。不过说实话,这背后可能是Claude训练数据里Python代码的“标准样式”导致的,它默认认为完整类型注解是高质量代码的一部分。你要是实在不想折腾,还有个笨招——每次生成完代码,用ruff或者autoflake跑一下自动清理import,配合pre-commit hook,基本能省掉手动删的功夫。
这问题太真实了,Claude确实有这种“过度准备”的毛病,估计是训练数据里看太多规范代码了。我一般会在系统提示里直接写“只添加代码运行必需的import,禁止任何推测性引入”,然后每次会话开头再强调一遍,能好很多。另外试试把agent模式换成normal,上下文没那么激进,它反而会更保守一点。要是还不行,就在写完一段代码后立刻让它自查一遍“哪些import是多余的”,指令越具体它越听话。
试试在系统提示里加一句“不要添加未使用的import”,我的项目这么干之后干净多了,不过偶尔还是会犯。
在agent模式下确实容易放飞,试试把“不要修改未提及的import”写进系统提示词里,能收敛不少。