大家好我是 SiKi老师。道具数量校验写成isinstance(value, int)结果配置里的True也过关了背包里多出一件“数量为真”的怪东西。先别改加减逻辑我会先打印类型和type(value) is int的结果再看布尔值是不是被当成了整数。本文在 Linux 上的 Python 3.12.15 中使用内置类型另用 3.13.5 复跑同一脚本结果一致。样例全部自拟只在内存中判断不读写真实背包或商店表也没有测试引擎里的数值组件。下面讨论的是工具端的数量字段协议不是引擎统一规定。官方在线文档标注的小版本是 3.12.15与本机一致。一 先复现 isinstance 会放行布尔值用几个自拟数量候选值做检查candidates[3,True,False,3.0,3,None]forvalueincandidates:print(repr(value),type(value).__name__,isinstance(value,int))本地输出里3为真True与False也为真3.0、3、None为假。也就是说只写isinstance(value, int)时布尔值会和普通整数走同一条“通过”分支。这不是配置文件写错了而是 Python 里bool是int的子类。官方文档在布尔类型一节写明bool是int的子类在很多数值上下文中False和True分别表现得像0和1但不建议依赖这一点需要时应显式转换。数量字段若直接信任isinstance就会把开关误当成件数。二 相等、运算和字典键都会把布尔当 0/1再看几处和数量相关的连带现象print(True1,False0,True2)print({True:flag,1:one})print({False:off,0:zero})本地得到True True 3、{True: one}和{False: zero}。True与1相等可以参与加法作为字典键时后写入的1会覆盖先写入的True只留下一条记录。若用字典汇总“是否拥有”和“拥有数量”键一旦撞车数据会静默合并。这些行为对排错很有用界面上看到数量变成1不一定是表里写了数字一也可能是某处把布尔开关写进了数量字段。本文只在纯 Python 对象上演示没有验证序列化到 JSON 或 CSV 之后引擎如何显示。三 用精确类型判断普通整数对“数量必须是普通整数”的协议我会写成检查type(value) is int而不是只看isinstancedefis_plain_int(value):returntype(value)isintprint(is_plain_int(3),is_plain_int(True),is_plain_int(False))print(is_plain_int(3.0),is_plain_int(3),is_plain_int(None))本地输出True False False和False False False。True/False被拒绝浮点和字符串也被拒绝。若项目允许0表示“没有”它仍是合法的普通整数需要和布尔False区分开这正是精确类型判断要保住的差别。另一种写法是isinstance(value, int) and not isinstance(value, bool)本地对上述样例结论相同。我更常用type(value) is int因为它直接表达“只要内置 int不要子类”。若团队自定义了整数子类并希望接受应在协议里单独写明本文没有实现那种扩展。四 加上业务范围而不是只看类型类型通过之后还要按协议检查范围。假设背包数量约定在0到999defread_count(value,lo0,hi999):iftype(value)isnotint:raiseTypeError(fwant plain int, got{type(value).__name__})ifnot(lovaluehi):raiseValueError(fout of range{value})returnvalueprint(read_count(3))forbadin(True,False,3.0,3,None,-1):try:read_count(bad)except(TypeError,ValueError)asexc:print(type(bad).__name__,-,exc)本地read_count(3)得到3布尔、浮点、字符串、None报TypeError-1报ValueError。范围上下界来自当前工具的自拟协议不是引擎上限也不是“所有游戏通用”的数值。换商店堆叠上限时应改协议和回归样例而不是在调用处散落魔法数字。这里没有把字符串3自动int()转换。宽松解析会把 3、03、3_0等一并接受可能和编号、文本 ID 的约定冲突需要解析时另写明确规则并单独验收。五 用回归样例锁住布尔与数量的边界本次独立验证覆盖isinstance放行布尔、True1与加法、字典键碰撞、type is int拒绝布尔与其他类型、范围上下界、错误类型与越界报告。全过程只在内存中运行不读写真实背包存档也不调用引擎 API。接手数量相关工具时可以先准备3、True、False、0四个值分别跑现有校验函数。若True能通过而业务不允许就说明当前判断还停在isinstance这一层。把“数量字段不得为 bool”写进说明比在每个调用点临时补丁更稳。你遇到的是布尔值混进了数量还是字符串数字被拒得太严给出字段的自拟样例和现在的判断表达式就能开始排查不需要上传真实存档。依据Python 3.12 内置类型官方文档中 Boolean Type 关于bool是int子类、以及数值上下文中True/False与1/0关系的说明。示例和表达原创不引用具体课程信息。
阅读完成 · 觉得有帮助?