fix: switch user_main invocation to use keyword arguments for better default parameter handling (#6756)

* fix: switch user_main invocation to use keyword arguments for better default parameter handling

* fix: test

---------

Co-authored-by: archer <545436317@qq.com>
This commit is contained in:
DigHuang
2026-04-15 23:04:37 +08:00
committed by GitHub
parent c9915a6bac
commit ac36cad6d9
4 changed files with 27 additions and 9 deletions
+11
View File
@@ -27,8 +27,19 @@ jobs:
node-version: '20'
cache: 'pnpm'
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install Dependencies
run: pnpm install
- name: Install Python Dependencies
run: pip install -r projects/code-sandbox/requirements.txt
- name: Run Unit Tests
run: pnpm --filter=code-sandbox test
+4 -7
View File
@@ -613,15 +613,12 @@ def main_loop():
else:
result = user_main(variables)
else:
call_args = []
# 用 kwargs 调用:缺席参数走函数默认值,不影响后面的参数
for p in params:
if p in variables:
call_args.append(variables[p])
elif sig.parameters[p].default is not _inspect_mod.Parameter.empty:
break
else:
if p not in variables and sig.parameters[p].default is _inspect_mod.Parameter.empty:
raise TypeError(f"Missing required argument: '{p}'")
result = user_main(*call_args)
call_kwargs = {p: variables[p] for p in params if p in variables}
result = user_main(**call_kwargs)
signal.alarm(0)
write_line({
@@ -99,6 +99,16 @@ def main(name, age):
expect(result.data?.codeReturn.msg).toBe('Hello, World!');
});
it('main 前置命名参数缺失但有默认值,后置参数仍按 kwargs 注入', async () => {
const result = await pool.execute({
code: `def main(a=None, b=None):
return {"a": a if a else "无", "b": b if b else "无"}`,
variables: { b: 'd2' }
});
expect(result.success).toBe(true);
expect(result.data?.codeReturn).toEqual({ a: '无', b: 'd2' });
});
// ===== 返回值类型兼容 =====
it('返回列表(旧版常见)', async () => {
@@ -25,8 +25,8 @@ beforeAll(async () => {
});
afterAll(async () => {
await jsPool.shutdown();
await pyPool.shutdown();
await jsPool?.shutdown();
await pyPool?.shutdown();
});
describe('模块拦截', () => {