Some simple information syncing
This commit is contained in:
@@ -477,16 +477,34 @@ class PythonToStubConverter:
|
||||
lines.append(f'{IndentStr}@{DecoratorStr}')
|
||||
|
||||
# 构建参数列表
|
||||
# 治本修复:原实现只遍历 node.args.args,完全忽略 node.args.defaults,
|
||||
# 导致带默认值的参数(如 category: str = "")在 .pyi 中丢失默认值。
|
||||
# 下游 DeclarationGenerator 据此生成 stub.ll 时,会因缺少默认参数而
|
||||
# 生成参数数量不足的 declare,进而造成调用方 ABI 不匹配崩溃。
|
||||
# 修复:按 Python AST 语义,defaults 从右向左对应 args 末尾的参数,
|
||||
# 对有默认值的参数附加 '= <default_value>'。
|
||||
params: list[str] = []
|
||||
NumDefaults: int = len(node.args.defaults) if node.args.defaults else 0
|
||||
DefaultsStart: int = len(node.args.args) - NumDefaults
|
||||
for arg_idx, arg in enumerate(node.args.args):
|
||||
ArgName: str = arg.arg
|
||||
if arg.annotation:
|
||||
TypeStr: str = PythonToStubConverter._GetTypeString(arg.annotation)
|
||||
params.append(f'{ArgName}: {TypeStr}')
|
||||
ParamPart: str = f'{ArgName}: {TypeStr}'
|
||||
elif class_name and arg_idx == 0 and ArgName == 'self':
|
||||
params.append(f'self: {class_name}')
|
||||
ParamPart = f'self: {class_name}'
|
||||
else:
|
||||
params.append(ArgName)
|
||||
ParamPart = ArgName
|
||||
# 附加默认值:defaults[i] 对应 args[DefaultsStart + i]
|
||||
if NumDefaults > 0 and arg_idx >= DefaultsStart:
|
||||
DefaultIdx: int = arg_idx - DefaultsStart
|
||||
try:
|
||||
DefaultStr: str = ast.unparse(node.args.defaults[DefaultIdx])
|
||||
ParamPart = f'{ParamPart} = {DefaultStr}'
|
||||
except Exception:
|
||||
# unparse 失败时保留无默认值形式,避免阻塞生成
|
||||
pass
|
||||
params.append(ParamPart)
|
||||
|
||||
# 处理 *args
|
||||
if node.args.vararg:
|
||||
|
||||
Reference in New Issue
Block a user