TypeError: int() argument must be a string, a bytes-like object or a number, not ‘KeyboardModifier‘

bug 经历

今天又遇到了一个奇怪的 bug,因为在前几天我都能正常使用 matplotlib 进行画图,但是今天却不行了,我还很好奇是不是我的代码有问题,就想着运行以下前两天写的画图代码,发现也报错了,报错信息如下:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier'

为什么只有这一行呢?因为我现在想复现那个bug又复现不了了(复现之后它变成了别的bug了),不过大致报错信息可以看:https://github.com/matplotlib/matplotlib/issues/24374,应该是差不多的,可能有的小伙伴上不了 github,我这里也把 github 上的报错信息复制过来:

Traceback (most recent call last):
  File "dt.py", line 14, in <module>
    plt.scatter(x, y, s=area, c=colors, alpha=0.5)
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 2817, in scatter
    __ret = gca().scatter(
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 2272, in gca
    return gcf().gca(**kwargs)
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 865, in gcf
    return figure()
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 809, in figure
    FigureClass=FigureClass, **kwargs)
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 324, in new_figure_manager
    _warn_if_gui_out_of_main_thread()
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 314, in _warn_if_gui_out_of_main_thread
    if (_get_required_interactive_framework(_get_backend_mod())
  File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 217, in _get_backend_mod
    switch_backend(
### 错误原因分析 `TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier'` 的错误表明 `int()` 函数接收到的数据类型不是它能够处理的字符串、字节对象或数值型数据,而是名为 `'KeyboardModifier'` 的一种特殊类型[^2]。 #### 关于 `int()` 函数的行为 `int()` 是 Python 中用于将输入转换为整数的一个内置函数。它的参数必须是可以被解释为数字的对象,比如字符串形式的数字(如 `"123"`)、浮点数或其他可直接表示为整数的类型。如果传入的是无法解析为数字的复杂对象,则会引发 `TypeError` 异常[^1]。 --- ### 用户代码的具体问题 在用户的代码片段中: ```python a = input().split(",") b = int(a) print(b) ``` 这段代码的核心问题是 `input().split(",")` 返回的结果是一个列表(list),而 `int()` 并不支持直接作用于列表类型的变量上。因此,在执行到 `b = int(a)` 这一步时,程序抛出了如下异常: ``` Traceback (most recent call last): File "C:/Users/86178/AppData/Local/Programs/Python/Python312/lianxi2.py", line 2, in <module> b=int(a) TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list' ``` 这说明 `a` 被赋值为了一个由逗号分隔符拆解后的列表结构,而不是单个可以转成整数的值。 --- ### 如何修正此问题? 要解决这个问题,可以通过遍历列表并逐项将其转化为整数来实现目标操作。以下是修改后的版本: ```python # 获取用户输入,并按逗号分割形成列表 raw_input = input() elements = raw_input.split(",") # 将每个元素转换为整数 converted_elements = [] for element in elements: try: converted_element = int(element.strip()) # 去除可能存在的多余空白字符后再转化 converted_elements.append(converted_element) except ValueError as e: print(f"Conversion failed due to invalid value '{element}': {e}") # 输出最终结果 if converted_elements: print(converted_elements) else: print("No valid integers were provided.") ``` 在这个改进版脚本里,我们先通过循环逐一访问原始输入经分割得到的所有子串;接着利用 `try-except` 结构捕获任何因非法格式引起的转换失败情况;最后仅保留成功转变为整数的部分作为输出。 对于特定场景下的 `'KeyboardModifier'` 类型错误,通常是因为某些库内部定义了自己的类或者枚举类型名称恰好叫这个名字所致。这类情况下建议重新审视项目依赖关系是否存在冲突以及确认实际传递给 `int()` 方法的内容确实是我们预期的形式而非意外混入的自定义实体实例。 --- ### 总结 - **核心错误**:`int()` 不支持对列表或非标准数值类型的操作。 - **解决方案**:确保只向 `int()` 提供合法的单一数值源材料,必要时需预处理多值集合以适配需求。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值