"""R617:解析实际生效值,未知键拒绝,再做单字段受控重跑。""" from decimal import Decimal as D, InvalidOperation DEFAULTS = {'lookback': 3, 'fee_bps': 2, 'qty': 1} def resolve(raw): if set(raw) - set(DEFAULTS): raise ValueError('unknown settings') result = {**DEFAULTS, **raw} if any(type(result[k]) is not int or result[k] < 1 for k in ['lookback', 'qty']): raise ValueError('invalid integer setting') try: fee=D(str(result['fee_bps'])) except (InvalidOperation,ValueError) as error: raise ValueError('invalid decimal fee') from error if not fee.is_finite() or fee < 0: raise ValueError('fee must be finite and nonnegative') result['fee_bps']=fee return result, {k: 'explicit' if k in raw else 'default' for k in result} def changes(a, b): return {k: (a[k], b[k]) for k in a if a[k] != b[k]} def controlled(a, b, allowed): diff = changes(a, b) if set(diff) - allowed: raise ValueError('unapproved setting change') return diff def execute(cfg): history=[D(90),D(95),D(100)] window=history[-cfg['lookback']:] if len(window)!=cfg['lookback']:raise ValueError('insufficient signal history') signal=int(window[-1]>sum(window)/len(window)) qty = D(cfg['qty'])*signal gross = qty * (D(110) - D(100)) cost = qty * D(210) * D(str(cfg['fee_bps'])) / D(10000) return {'effective': dict(cfg), 'net': gross - cost} a, origins = resolve({}) b, _ = resolve({'fee_bps': 2}) assert changes(a, b) == {} c, _ = resolve({'fee_bps': 4, 'qty': 2}) try: controlled(a, c, {'fee_bps'}) except ValueError: pass else: raise AssertionError('multiple intervention accepted') d, _ = resolve({'fee_bps': 4}) assert set(controlled(a, d, {'fee_bps'})) == {'fee_bps'} left, right = execute(a), execute(d) assert left['net'] == D('9.958') and right['net'] == D('9.916') assert left['effective'] == a and right['effective'] == d short, _ = resolve({'lookback':1}) assert execute(short)['net']==0 try: resolve({'fee_bp': 4}) except ValueError: pass else: raise AssertionError('unknown field accepted') print('omitted_vs_explicit_default_diff={} origins=' + str(origins)) print('allowed_diff=' + str(changes(a, d)) + ' net=9.958,9.916') print('multi_change=rejected unknown_key=rejected effective_receipts=matched') # 审阅回归:非有限费用必须在解析时以明确异常拒绝。 invalid_fee_cases=[float('nan'),float('inf'),float('-inf'),'NaN','Infinity','-Infinity'] rejections=[] for invalid in invalid_fee_cases: try: resolve({'fee_bps':invalid}) except ValueError: pass except Exception as error: rejections.append((str(invalid),'wrong_exception:'+type(error).__name__)) else: rejections.append((str(invalid),'accepted')) assert not rejections, rejections print('nonfinite_fee_inputs=rejected_at_resolution')