From 33c0f4414c14896a36cea83b749aac4094464012 Mon Sep 17 00:00:00 2001 From: KenanZhu <3471685733@qq.com> Date: Sun, 17 May 2026 02:58:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(autoscript):=20=E4=B8=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=8C=E5=8F=B7=E4=BF=A1=E6=81=AF=E5=B9=B6?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=B1=BB=E5=9E=8B=E5=85=BC=E5=AE=B9=E6=80=A7?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/autoscript/ASEngine.py | 21 +++++++++++++++------ src/autoscript/ASOperator.py | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/autoscript/ASEngine.py b/src/autoscript/ASEngine.py index 8eaed3d..f73657b 100644 --- a/src/autoscript/ASEngine.py +++ b/src/autoscript/ASEngine.py @@ -307,9 +307,12 @@ def _evaluateCondition( continue left_raw = s[:idx].strip() right_raw = s[idx + len(op):].strip() - left_obj = _resolveAsObject(left_raw, target_data) - right_obj = _resolveAsObject(right_raw, target_data) - return ASOperator.compare(left_obj, right_obj, op, target_data) + try: + left_obj = _resolveAsObject(left_raw, target_data) + right_obj = _resolveAsObject(right_raw, target_data) + return ASOperator.compare(left_obj, right_obj, op, target_data) + except ValueError as e: + raise ValueError(_errPos(line, str(e))) raise ValueError( _errPos(line, f"无法识别的条件表达式 '{condition_str}'") ) @@ -352,7 +355,10 @@ def _executeSet( if not obj: obj = _SCRIPT_VARS.get(upper_name) if obj: - obj.setValue(resolved, target_data) + try: + obj.setValue(resolved, target_data) + except ValueError as e: + raise ValueError(_errPos(line, str(e))) return inferred_type = _inferType(resolved, stripped) new_var = ASObject( @@ -398,8 +404,11 @@ def _executeOperation( target = _resolveFieldObj(field_name) if target is None: raise ValueError(_errPos(line, f"未知字段 '{field_name}'")) - operand = _resolveAsObject(raw_value, target_data) - ASOperator.apply(target, operand, op, target_data) + try: + operand = _resolveAsObject(raw_value, target_data) + ASOperator.apply(target, operand, op, target_data) + except ValueError as e: + raise ValueError(_errPos(line, str(e))) def addTargetVar( diff --git a/src/autoscript/ASOperator.py b/src/autoscript/ASOperator.py index 65f55fb..49facd7 100644 --- a/src/autoscript/ASOperator.py +++ b/src/autoscript/ASOperator.py @@ -55,6 +55,14 @@ class ASOperator: ".BLE.": lambda a, b: a <= b, } _ARITH_TYPES = {"Date", "Time", "Int", "Float"} + # Comparison-compatible type groups + _COMPATIBLE_GROUPS = [ + {"String"}, + {"Boolean"}, + {"Int", "Float"}, + {"Date"}, + {"Time"}, + ] @classmethod def apply( @@ -177,6 +185,18 @@ class ASOperator: cmp_func = cls._COMPARE.get(op) if cmp_func is None: raise ValueError(f"未知的比较操作 '{op}'") + left_tp = left.var_type + right_tp = right.var_type + if left_tp != right_tp: + same_group = any( + left_tp in g and right_tp in g + for g in cls._COMPATIBLE_GROUPS + ) + if not same_group: + raise ValueError( + f"类型不兼容: 无法将 '{left.name}' ({left_tp}) " + f"与 '{right.name}' ({right_tp}) 进行比较" + ) left_val = left.getValue(target_data) right_val = right.getValue(target_data) try: