参数判断。一点小经验

博客指出在程序中先进行判断,再在JS里进行判断,但由于JS运行在客户端,浏览器可将其禁掉,存在较大危险。

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

先在程序里写判断,再在js里写判断,js在客户端,浏览器是可以禁掉的,很危险!!
### 如何在 Python 中检查参数类型 为了确保函数接收到预期类型的参数,在定义函数可以利用多种方法来验证输入参数的数据类型。一种常见的方式是在函数内部手动检查传入参数的类型,另一种更为现代的方法是使用 Python 的类型提示功能并结合 `typing` 模块。 #### 手动检查参数类型 通过内置函数 `isinstance()` 可以方便地检测变量是否属于特定类型: ```python def add_numbers(a, b): if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): raise TypeError("Both arguments must be int or float") return a + b ``` 此代码片段展示了如何强制执行两个数值相加操作前先确认它们确实是数字[^1]。 #### 使用类型注解与静态分析工具 自 Python 3.5 版本起引入了对类型标注的支持,这允许开发者声明期望接收以及返回值的具体数据类型。虽然这些注解不会影响程序运行的行为,但是配合像 mypy 这样的第三方库可以帮助发现潜在错误。 下面是一个带有类型注解的例子: ```python from typing import Union def multiply(x: Union[int, float], y: Union[int, float]) -> Union[int, float]: """Multiply two numbers.""" result = x * y # Even with type hints, you may still want runtime checks for safety-critical applications. if not isinstance(result, (int, float)): raise ValueError(f"Unexpected result type {type(result)} from multiplication.") return result ``` 这里不仅指定了输入参数应为何种类型,同也明确了该函数应该给出的结果形式。对于更复杂的情况还可以借助于 `Union[]`, `List[]`, 或者其他来自 `typing` 库中的构造器来描述复合型态。 #### 利用装饰器自动进行类型检查 如果希望简化重复性的类型校验逻辑,则可以通过创建一个通用的装饰器实现这一点。这样每次调用被装饰过的函数之前都会自动完成必要的检验工作而无需每次都显式编相同的代码。 ```python import functools def enforce_types(func): @functools.wraps(func) def wrapper(*args, **kwargs): annotations = func.__annotations__ all_args = kwargs.copy() all_args.update(dict(zip(func.__code__.co_varnames[:len(args)], args))) for arg_name, expected_type in annotations.items(): actual_value = all_args.get(arg_name) if hasattr(expected_type, '__origin__') and expected_type.__origin__ is Union: valid = any(isinstance(actual_value, t) for t in expected_type.__args__) elif actual_value is None and expected_type is type(None): continue else: valid = isinstance(actual_value, expected_type) if not valid: raise TypeError( f'Argument "{arg_name}" was supposed to be ' f'{expected_type}, but instead got {type(actual_value)}.' ) return func(*args, **kwargs) return wrapper @enforce_types def greet(name: str) -> str: return 'Hello, ' + name print(greet('Alice')) # Output: Hello, Alice try: print(greet(123)) except Exception as e: print(e) # Argument "name" was supposed to be <class 'str'>, but instead got <class 'int'>. ``` 上述例子中定义了一个名为 `enforce_types` 的装饰器用于拦截任何违反指定签名的操作尝试,并抛出异常通知使用者存在不匹配之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值