浅谈assert的几种用法

本文详细阐述了在编程中确保函数参数有效性、返回值正确性及执行环境状态的方法,通过实例展示了如何实现这些检查,旨在提高代码质量和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.函数参数有效性检查

Example:

① def         SetScale(self, s):
                   assert     s > 0.0, s
                   self.model.scale = math3d.vector(s, s, s)


② def         SetTexture(self, textureName):
                   assert   textureName != ''
 

③ def         RotateToHorzDirection(self, dir):
                   dir.y = 0.0
                   assert   abs(dir) >= 1e-3, dir



2.函数返回值检查,检查函数执行是否有效

Example:

① def         OnModelLoaded(self, model):
              self.model = model
              self.rootbone = self.model.get_root_bone()
              assert self.rootbone >= 0



3.执行环境有效性检查

Example:

① def         showPrompt(utf8_msg):
             assert   _WorldProcInst.IM.IsActive()
            _WorldProcInst.IM.AddToChatBox(utf8_msg)


② def         BindSocket(self, socket,  o):
             assert self.model is not None
             self.model.bind(socket,o)


③ if msg_type == raidprotocol.RD_MSG_SCENE_FOG_PROPERTY_UPDATE:
              assert  self.scn is not None
              self.scn.set_fog(FogType, FogMode, FogColor, FogStart, FogEnd,FogDensity)


④ if msg_type == gsprotocol.GS_MSG_SIGN_OUT_RES_SUCCEEDED:
              assert   self._proc_state == self.PROC_STATE_NORMAL
             self._SwitchState(self.PROC_STATE_SIGN_OUT)
              returnFalse


⑤ def         __OnPickMember(self, obj):
              assert self.squad is not None
 


4.非法情况检查,非法逻辑分支

Example:

① def         ShowStall(self, bShow, type):
                     if       type == gsconsts.STALL_TYPE_COMMON:
                            self._stall_common=render.model('./meshes/items/sellbag.gim')
                     elif    type == gsconsts.STALL_TYPE_ADVANCE1:
                            self._stall_common=render.model('./meshes/items/tanwei01.gim')
                     else:
                            assert  0, 'unknown stall type'


② def         MainSubProc(self):
                    for v in [self.WorldGame,self.RaidGame, self.Farm.home]:
                           if v.IsActive():
                                  return v
                    
                    assert   0, 'should never come tohere'
                    return None


③ void  OnEvent(event,  args)
        {
              switch(event)
              {
              case EVENT0:
                  ...
              break;
              
              case EVENT1:
                  ...
              break;
              
              case EVENT2:
                  ...
              break;
              
               default:
                     assert    0 &&  "invalid event"
              }
       }



5.防止重入

Example:

① def       OnCharacterEnterAOI(self, char_aoi, pet_aoi):
              key = char_aoi.char_rtid
              assert   key not in self.aoiRemoteChar,  char_aoi.char_name


② def       AddBuffer(self, bufferRtid, typeID, srcRtID, life_Time=0.0,int_Mode=0, real_Mod=0.0):
              assert  bufferRtid not in  self.BufferMap


③ def        Initial(self, initChildProcName):
              global Instance
              assert Instance is None                        #全局共享数据写保护
              Instance = self
              return True



6.多个需要保持同步的变量一致性检查

Example:

1)       class       CString:
                def  __init__(self,s):
                       self._str = s
                       self._len= len(s)


               def  length(self):
                       assert  self._len == len(self._str)
                       returnself._len


               def  set(self,s):
                       self._str = s
                       self._len= len(s)


### Python 中 `assert` 语句的使用方法及示例 #### 基本概念 `assert` 是 Python 中的一种调试工具,用于确认程序中的某个条件是否为真。如果条件为假,则会触发 `AssertionError` 异常,并停止程序执行[^2]。 --- #### 基本语法 `assert` 的基本语法如下: ```python assert condition, message ``` 其中: - `condition`: 需要验证的布尔表达式。 - `message`: 当条件为假时,显示的错误信息(可选)。 --- #### 示例代码 ##### 示例 1:基础用法 以下是一个简单的 `assert` 示例,用于验证变量 `age` 是否大于等于 18。 ```python age = 16 assert age >= 18, "Age must be at least 18" print("Access granted") ``` 如果运行以上代码,由于 `age` 小于 18,`assert` 会抛出异常并打印指定的消息[^4]。 ##### 示例 2:无消息参数 如果没有提供第二个参数,`assert` 默认会抛出一个不带任何描述的 `AssertionError`。 ```python value = None assert value # 如果 value 不为 True,则抛出 AssertionError ``` ##### 示例 3:数组条件判断 在处理 NumPy 数组或其他集合类型时需要注意,直接使用 `assert` 判断其真假值可能导致歧义。此时应显式调用 `.any()` 或 `.all()` 方法[^5]。 ```python import numpy as np array = np.array([True, False]) # 错误做法 assert array # 抛出 ValueError: The truth value of an array with more than one element is ambiguous. # 正确做法 assert array.any(), "At least one element must be True" assert array.all(), "All elements must be True" ``` --- #### 注意事项 1. **括号问题**: 在编写 `assert` 语句时,切勿为其整体加上多余的括号,否则可能会导致意外行为[^3]。 ```python # 错误示范 assert(1 == 2, 'This should fail') # 触发 SyntaxWarning # 正确写法 assert 1 == 2, 'This should fail' ``` 2. **优化模式的影响**: 当 Python 解释器以优化模式 (`-O` 参数) 启动时,所有的 `assert` 语句会被忽略[^1]。因此不应依赖 `assert` 进行生产环境的关键逻辑校验。 3. **替代方案**: 对于需要在正式发布版本中保留的功能性检查,建议改用常规的 `if-else` 结构配合手动抛出异常。 --- #### 应用场景 - **输入验证**: 确保函数接收到的有效参数满足预期。 - **单元测试**: 在测试框架中广泛使用 `assert` 来对比实际输出与期望结果。 - **内部状态检查**: 验证类或模块内的私有属性保持一致性。 --- #### 最佳实践 - 明确区分开发期使用的断言和产品级的错误处理机制。 - 编写清晰且有意义的提示信息以便后续排查问题。 - 避免滥用 `assert` 导致不必要的性能开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值