pyQiwiP2P 使用 QIWI 支付时出现 TypeError
结论
这个异常和 pay_sources 选择了 QIWI、银行卡还是手机支付没有关系,也不是 QIWI 接口返回的支付错误。程序在导入 pyqiwip2p 时就已经失败。
list[str] 是 Python 3.9 开始正式支持的内置泛型写法。如果虚拟环境使用的是 Python 3.8 或更早版本,解释器会尝试对 list 类型执行下标操作,随后抛出:
TypeError: 'type' object is not subscriptable
建议安装 Python 3.9 或更高版本,重新创建虚拟环境,再安装 pyqiwip2p。
为什么会在函数定义处报错
库中使用了类似这样的类型注解:
pay_sources: list[str] = None
在 Python 3.9 及更高版本中,这表示“由字符串组成的列表”。旧版 Python 不支持直接将内置类型写成 list[str],需要使用下面的兼容写法:
from typing import List
pay_sources: List[str] = None
解释器会在加载模块时解析类型注解。因此,异常出现在导入 QiwiP2P 的阶段,还没有执行 p2p.bill(),也没有访问 QIWI 支付接口。
可以先检查虚拟环境实际使用的 Python 版本:
python --version
python -c "import sys; print(sys.executable); print(sys.version)"
第二条命令还会显示解释器路径,可以用来判断当前运行的是否为预期虚拟环境中的 Python。
推荐解决方案:升级 Python 并重建虚拟环境
安装 Python 3.9 或更高版本后,需要重新创建虚拟环境。旧虚拟环境仍然绑定原来的解释器,不能直接继续使用。
py -3.9 -m venv venv
venv\Scripts\activate
python -m pip install --upgrade pip
python -m pip install pyqiwip2p
如果机器上安装的是其他较新的 Python 版本,把 -3.9 换成对应版本即可。安装完成后再次检查版本:
python --version
无法升级 Python 时的处理方式
如果项目必须使用 Python 3.7 或 3.8,可以安装明确支持该 Python 版本的 pyqiwip2p 旧版本。安装前应查看相应版本的兼容说明,不要只根据版本号判断。
也可以临时修改第三方库源码来避开这个错误。例如,把:
pay_sources: list[str] = None
改为:
from typing import List
pay_sources: List[str] = None
还有一种可能的兼容方法是在模块顶部加入:
from __future__ import annotations
但直接修改 site-packages 不适合长期使用。重新安装或升级依赖后,这些修改会丢失,库中也可能存在其他与旧版 Python 不兼容的语法。如果必须兼容旧环境,更合适的做法是固定已经确认兼容的版本,或者维护一个经过测试的依赖分支。
调整后的调用示例
升级解释器并正确安装依赖后,可以用下面的代码创建账单。示例中的 bill_id 必须由程序生成或由外部传入,不能使用未定义的 random_id:
from uuid import uuid4
from pyqiwip2p import QiwiP2P
from pyqiwip2p.Qiwip2p import PaymentMethods
def create_trans(amount=400, lifetime=30, comment="def"):
p2p = QiwiP2P(auth_key="YOUR_SECRET_KEY")
bill = p2p.bill(
amount=amount,
lifetime=lifetime,
comment=comment,
bill_id=str(uuid4()),
pay_sources=[
PaymentMethods.qiwi,
PaymentMethods.card,
PaymentMethods.mobile,
],
)
return bill
如果只允许使用 QIWI 钱包支付,可以把支付来源缩小为:
pay_sources=[PaymentMethods.qiwi]
pay_sources 只用于限制账单支持的支付渠道,无法解决解释器的语法兼容问题。
注意事项
- 升级 Python 后需要重新创建虚拟环境。只升级
pip不会改变 Python 版本。 - 如果示例中的
random_id没有提前定义,当前异常修复后还会出现NameError。 bill_id应保持唯一,并符合当前库和支付接口对该字段的要求。- 不要把真实的
auth_key写入源码或提交到版本库。建议从环境变量或密钥管理服务中读取。 - 修复
list[str]只能解决本地导入错误。账单能否成功创建和支付,还取决于账户状态、密钥权限、接口可用性,以及 QIWI 当前在相应地区提供的服务。
备注:内容仅供参考。
