本文档详细说明了对 InputManager.create_input() 方法的优化改进,包括增强的参数验证、错误处理和返回值结构。
- 参数验证不够全面 - 只检查场景参数,没有验证输入名称和类型
- 缺少重复检查 - 不检查输入名称是否已存在
- 错误处理简单 - 只有基本的异常捕获
- 返回值信息有限 - 只返回 UUID 和场景项 ID
- 没有输入类型验证 - 不检查输入类型是否受支持
- ✅ 全面的参数验证
- ✅ 智能重复检查
- ✅ 增强的错误处理
- ✅ 丰富的返回值
- ✅ 输入类型验证
# 新增参数
check_duplicates: bool = True # 是否检查重复名称
# 增强的验证逻辑
- 检查输入名称不能为空
- 检查输入类型不能为空
- 验证场景参数的互斥性
- 可选的重复名称检查
- 输入类型支持性验证# 检查输入名称是否已存在
if check_duplicates and self.exists(input_name):
raise ValueError(f"输入名称 '{input_name}' 已存在")特性:
- 默认启用重复检查
- 可通过
check_duplicates=False禁用 - 使用现有的
exists()方法进行检查
# 验证输入类型是否支持
available_kinds = self.get_input_kinds()
if available_kinds and input_kind not in available_kinds:
self.logger.warning(f"输入类型 '{input_kind}' 可能不受支持")特性:
- 检查输入类型是否在支持列表中
- 不支持的类型会记录警告但仍然尝试创建
- 避免因类型检查失败而阻止创建
# 具体的异常类型识别
if 'scene' in error_msg and ('not found' in error_msg or '不存在' in error_msg):
raise OBSResourceNotFoundError(f"场景不存在: {scene_name or scene_uuid}")
elif 'input' in error_msg and ('exists' in error_msg or '已存在' in error_msg):
raise ValueError(f"输入名称 '{input_name}' 已存在")改进:
- 识别特定的 OBS 错误类型
- 提供更有意义的错误信息
- 使用适当的异常类型
# 优化前
return {
'input_uuid': result.get('inputUuid', ''),
'scene_item_id': result.get('sceneItemId', 0)
}
# 优化后
return {
'input_uuid': input_uuid,
'scene_item_id': scene_item_id,
'input_name': input_name, # 新增
'input_kind': input_kind, # 新增
'success': True # 新增
}新增字段:
input_name: 输入名称input_kind: 输入类型success: 创建是否成功
# 调试信息
self.logger.debug(f"创建输入请求参数: {request_params}")
# 详细的成功信息
self.logger.info(f"成功创建输入 '{input_name}' (UUID: {input_uuid}, 场景项ID: {scene_item_id})")
# 警告信息
self.logger.warning(f"创建输入 '{input_name}' 的响应为空或无效")- 基本创建功能 - 验证正常创建流程
- 参数验证 - 测试各种无效参数
- 重复名称检查 - 测试重复检查功能
- 返回值结构 - 验证返回值的完整性
- 输入类型验证 - 测试类型验证功能
测试结果: 5/5 通过
✅ 基本创建功能 测试通过
✅ 参数验证 测试通过
✅ 重复名称检查 测试通过
✅ 返回值结构 测试通过
✅ 输入类型验证 测试通过
result = obs.inputs.create_input(
input_name="我的文本源",
input_kind="text_gdiplus_v3",
scene_name="主场景",
input_settings={"text": "Hello World!"}
)
if result['success']:
print(f"创建成功: {result['input_uuid']}")
else:
print("创建失败")result = obs.inputs.create_input(
input_name="可能重复的名称",
input_kind="text_gdiplus_v3",
scene_name="主场景",
check_duplicates=False # 禁用重复检查
)result = obs.inputs.create_input(
input_name="新输入源",
input_kind="image_source",
scene_uuid="scene-uuid-123",
input_settings={"file": "image.png"}
)- 总是检查返回值的 success 字段
- 使用有意义的输入名称
- 验证输入类型是否受支持
- 适当处理异常情况
- 在生产环境中启用重复检查
- 所有原有参数保持不变
- 新增参数都有默认值
- 返回值结构向后兼容(新增字段)
- 异常类型可能有变化(更具体)
- 输入类型验证:只是警告,不会阻止创建
- 重复检查:默认启用,可以禁用
- 错误处理:更具体的异常类型
- 日志级别:增加了 debug 和 warning 级别的日志
- 性能影响:增加了一些验证步骤,但影响很小
# 运行优化后的测试
py -3.11 tests/test_create_input_optimized.py这些优化使 create_input 方法更加健壮、用户友好,并提供了更好的错误处理和调试信息。