openapi-generators / openapi-generators/openapi-python-client
Enum properties with nullable: true don't handle null values
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 2k
- 派生
- 293
- 平均合并
- 34 分钟
- 30 天内合并 PR
- 1
描述
Description
When an OpenAPI schema defines an enum property with nullable: true as a property attribute (rather than including null in the enum values), the generated Python code raises TypeError when deserializing null from the API.
OpenAPI Schema
conditionable_type:
type: string
enum:
- AlertField
nullable: true
Expected Behavior
Per OpenAPI v3.0.3 spec:
"If
nullableis true, thennullis allowed as a value regardless of any other constraints."
The generated code should accept None as a valid value.
Actual Behavior
The generated from_dict() method passes None directly to the enum check function, which raises:
TypeError: Unexpected value None. Expected one of {'AlertField'}
Generated Code (v0.28.2)
_conditionable_type = d.pop("conditionable_type", UNSET)
conditionable_type: SomeEnumType | Unset # Missing `| None`
if isinstance(_conditionable_type, Unset):
conditionable_type = UNSET
else:
# Passes None directly to check function - FAILS
conditionable_type = check_some_enum_type(_conditionable_type)
Expected Generated Code
Should be similar to how nullable string properties are handled:
def _parse_conditionable_type(data: object) -> SomeEnumType | None | Unset:
if data is None:
return data
if isinstance(data, Unset):
return data
return check_some_enum_type(data)
conditionable_type = _parse_conditionable_type(d.pop("conditionable_type", UNSET))
Root Cause
The EnumProperty class only checks for null in the enum values list:
unchecked_value_list = [value for value in enum if value is not None]
It does not check for nullable: true as a separate property attribute on the schema.
Related Issues
- #504, #512, #516 - Fixed
nullbeing in the enum values (enum: [value, null]) - This issue is about
nullable: trueas a property attribute (enum: [value]+nullable: true)
Both are valid per OpenAPI spec, but only the first case is currently handled.
Reproduction
Minimal OpenAPI spec:
openapi: "3.0.3"
info:
title: Test
version: "1.0"
paths: {}
components:
schemas:
TestModel:
type: object
properties:
my_enum:
type: string
enum:
- value1
nullable: true
Generate client, then:
from my_client.models import TestModel
TestModel.from_dict({"my_enum": None}) # Raises TypeError
Version
- openapi-python-client: 0.28.2
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 EnumProperty 的实现以及 issue 中描述的生成模型 from_dict() 路径开始。跟踪 nullable 字符串属性如何保留 None,然后为 nullable 枚举属性添加等效处理,同时保留枚举验证。确认复现用例接受 None 而不会引发 TypeError,并且仍然拒绝意外的非 None 值。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- api
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 58/100