python 参数类型匹配提醒

本文探讨了Python中类型注解的使用,包括defa函数参数的str约束、List和Dict类型的限制,以及多种类型联合的应用。重点指出实际中的灵活应用与潜在问题,如类型警告与动态语言特性。

1、对于常见类型,如下:

def a(b:str):pass

2、List 类型限制:

from typing import List
def a(b:List[str]):pass

3、Dict类型限制:

from typing import Dict
def a(b:Dict[str]):pass

def c(b:Dict[str,int]):pass

4、Tuple类型:

from typing import Tuple
def a(b:Tuple[str,int]):pass

5、多类型限制:

from typing import Union
def a(b:Union[str,int,None]):pass

不足:

1、虽然我们指定了List[int]即由int组成的列表,但是,实际中,只要这个列表中存在int(其他的可以为任何类型),就不会出现警告

2、由于python是即是编译语言,所以pycharm只是提出了警告,但实际上运行时不一定会报错,毕竟python的本质还是动态语言

<think>好的,用户想了解Python参数化的用法和实现,特别是示例和用法。首先,我需要明确“参数化”在不同上下文中的含义。根据提供的引用内容,参数化主要涉及测试参数化和数据库查询参数化。 首先看测试参数化。用户提到的引用[1]提到了parameterized模块,这是一个第三方库,用于在测试中为测试用例提供多组参数。我需要解释如何使用这个模块,比如安装方法、基本语法,并给出示例代码。比如,用户可能需要编写多个测试用例,但代码重复,使用参数化可以简化代码。需要展示如何用@parameterized.expand装饰器,以及参数如何传递到测试方法中。 然后是数据库查询的参数化,引用[3]提到使用预编译语句执行参数化查询,防止SQL注入。这里需要说明在Python中如何操作,比如使用MySQL的cursor.execute()方法,用占位符%s,并传递元组或字典作为参数。要强调安全性,避免拼接字符串,以及参数化查询的优势,比如性能提升和安全性。 接下来需要检查是否有其他参数化的场景,比如数据处理中的参数化,但根据提供的引用,可能主要集中在测试和数据库。需要确保覆盖这两个方面,并分别给出示例。 用户可能需要具体的代码示例,所以每个部分都要有代码块。比如测试参数化部分展示使用unittest和parameterized的例子,数据库部分展示使用pymysql的例子。同时,注意事项部分需要提醒安装第三方库、占位符的差异(如SQLite用?),以及参数化在安全性和效率上的好处。 最后,生成相关问题,帮助用户进一步探索。比如参数化测试的其他方法,防止SQL注入的其他方法,以及参数化在数据合并中的应用(引用[2]中的pandas.concat可能相关,但用户问题主要围绕参数化,所以可能不需要深入,除非有直接关联)。 需要确保回答结构清晰,分点解释,代码正确,并且引用标记正确。比如引用[1]对应parameterized模块,引用[3]对应数据库参数化查询。同时,使用中文,数学公式格式正确,但用户问题可能不涉及数学公式,所以可能不需要使用。</think>### Python参数化方法详解 参数化在Python中主要有两大应用场景:测试用例参数化和数据库查询参数化。以下是具体实现方法和示例: --- #### 一、测试参数化(使用parameterized模块) 通过为测试方法注入多组参数实现批量测试,避免重复代码[^1] 1. 安装模块 ```bash pip install parameterized ``` 2. 基础用法示例 ```python from parameterized import parameterized import unittest class TestMath(unittest.TestCase): @parameterized.expand([ ("case1", 2, 3, 5), # 测试用例名称,输入a,输入b,预期结果 ("case2", 0, 0, 0), ("case3", -5, 5, 0) ]) def test_add(self, name, a, b, expected): self.assertEqual(a + b, expected) ``` 3. 运行效果 ```shell $ python -m unittest test_math.py 测试将自动执行3组参数化用例 ``` --- #### 二、数据库参数化查询 使用预编译语句防止SQL注入攻击[^3] 1. MySQL参数化示例 ```python import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', database='test') cursor = conn.cursor() # 使用%s作为占位符 sql = "INSERT INTO users (name, age) VALUES (%s, %s)" params = [('张三', 25), ('李四', 30)] # 批量执行 cursor.executemany(sql, params) conn.commit() ``` 2. SQLite参数化示例 ```python import sqlite3 conn = sqlite3.connect('test.db') cursor = conn.cursor() # SQLite使用?作为占位符 cursor.execute("SELECT * FROM users WHERE age > ?", (18,)) ``` --- #### 三、核心优势对比 | 方法类型 | 主要作用 | 安全优势 | 效率提升 | |----------------|-------------------------|-------------------|--------------| | 测试参数化 | 批量验证多场景用例 | 避免测试遗漏 | 减少代码量 | | 数据库参数化 | 防止SQL注入攻击 | 过滤危险字符 | 预编译复用 | --- #### 四、注意事项 1. 占位符类型需与数据库匹配(MySQL用`%s`,SQLite用`?`) 2. 参数必须使用元组/列表格式传递 3. 字符串参数无需额外添加引号 4. 参数化查询不能用于表名、列名等结构部分
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值