查看: 205|回复: 3

[Python] 这是Python的bug吗???

[复制链接]

0

技术

2

魅力

1

原创

略有小成

Rank: 4

积分
1011
人气
14
分享
0

最佳新人

发表于 2025-1-10 17:14:19 | 显示全部楼层 |阅读模式



我没格式化字符串为啥这个报错啊??!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

技术

8

魅力

0

原创

共绘星辰

Rank: 6Rank: 6

积分
8055
人气
103
分享
299

灌水之王最佳新人活跃会员

发表于 2025-1-11 09:48:09 | 显示全部楼层
好的,我来尝试解决这个问题。首先,我需要理解用户提供的错误信息。

错误信息显示:
```
TypeError: not all arguments converted during string formatting
```
这通常意味着在格式化字符串时,传递的参数数量与占位符数量不匹配。具体来看,错误发生在这一行:
```python
if keySeq2 == '%s':
```
等等,这看起来不太对劲。`keySeq2` 是一个变量,而 `'%s'` 是一个字符串格式化占位符。这里似乎有些混淆。

让我再仔细看看代码的上下文:
```python
def autoEnc(keySeq, data):
    if keySeq2 == '%s':
        key = loadkey(k[keySeq])
        return aesEn(data, key[0])
    else:
        key = loadkey(k[keySeq])
        return rsaEn(data, key[1])
```
哦,我明白了。这里有一个变量 `keySeq2`,但在函数 `autoEnc` 中,参数是 `keySeq`。可能 `keySeq2` 是在函数外部定义的,但在函数内部使用时出现了问题。

再看看错误堆栈:
```
File "D:\Kylie_Python\PyCry\code\1.0.0.0\encrypt.pyw", line 66, in autoEnc
    if keySeq2 == '%s':
```
这表明 `keySeq2` 被直接与 `'%s'` 进行比较,但 `keySeq2` 可能是一个格式化后的字符串,而不是预期的变量。

或许问题出在 `keySeq2` 的赋值上。让我们再看看:
```python
k = [saveKeyA(get_random_bytes(16), rsa.newkeys(2048)[1]), saveKeyB(get_random_bytes(16), rsa.newkeys(2048)[1])]
```
这里定义了一个列表 `k`,包含两个元素,每个元素都是一个元组,包含一个 AES 密钥和一个 RSA 密钥对。

然后:
```python
if keySeq2 == '%s':
```
这行代码可能是在尝试将 `keySeq2` 格式化为一个字符串,但没有提供足够的参数。

等等,也许 `keySeq2` 是通过某种方式从 `k` 中获取的,但没有正确处理。让我们再看看:
```python
keySeq2 = '%s'
```
如果这是赋值语句,那么 `keySeq2` 被赋值为字符串 `'%s'`,这可能不是预期的行为。

我认为问题在于 `keySeq2` 的使用方式。如果 `keySeq2` 应该是一个格式化后的字符串,那么需要确保所有占位符都被正确替换。例如:
```python
keySeq2 = '%s' % some_value
```
但如果没有提供 `some_value`,就会导致 `TypeError`。

因此,解决这个问题的方法是确保在使用格式化字符串时,所有占位符都有对应的参数。例如,如果 `keySeq2` 应该包含 `keySeq` 的值,那么可以这样写:
```python
keySeq2 = '%s' % keySeq
```
这样,`keySeq2` 就会正确地包含 `keySeq` 的值,而不会出现类型错误。

让我再检查一下代码,看看是否有其他地方需要调整。如果 `keySeq2` 是在函数外部定义的,确保它在函数内部被正确引用。如果 `keySeq2` 是一个全局变量,可能需要在函数内部使用 `global` 关键字来引用它。

总之,关键在于确保格式化字符串中的所有占位符都被正确替换,以避免 `TypeError`。希望这能帮助你解决问题。

让我尝试重构这段代码,使其更加清晰:

```python
def autoEnc(keySeq, data):
    if keySeq == '%s':
        key = loadkey(k[keySeq])
        return aesEn(data, key[0])
    else:
        key = loadkey(k[keySeq])
        return rsaEn(data, key[1])
```

如此一来,逻辑更加简洁明了。然而,若 `keySeq` 本应是一个格式化后的字符串,那么我可能需要在比较之前对其进行处理。例如:

```python
def autoEnc(keySeq, data):
    formatted_keySeq = '%s' % keySeq
    if formatted_keySeq == '%s':
        key = loadkey(k[keySeq])
        return aesEn(data, key[0])
    else:
        key = loadkey(k[keySeq])
        return rsaEn(data, key[1])
```

不过,这似乎有些多余。或许问题的根源在于其他地方。让我们再仔细审视一下 `k` 的定义:

```python
k = [saveKeyA(get_random_bytes(16), rsa.newkeys(2048)[1]), saveKeyB(get_random_bytes(16), rsa.newkeys(2048)[1])]
```

这里,`k` 是一个包含两个元素的列表,每个元素都是一个元组,分别包含一个 AES 密钥和一个 RSA 密钥对。因此,`k[keySeq]` 应该根据 `keySeq` 的值返回相应的密钥。

若 `keySeq` 是一个索引,那么将其与 `'%s'` 进行比较可能并不合适。或许 `keySeq` 应该是一个标识符或某种标识,以决定使用哪种加密方法。

我认为需要澄清 `keySeq` 的预期用途。如果 `keySeq` 是一个标识符,那么将其与 `'%s'` 进行比较可能并不正确。相反,可能需要根据 `keySeq` 的值来选择不同的加密方法。

让我们尝试另一种方法。假设 `keySeq` 可以是 'aes' 或 'rsa',那么代码可以这样写:

```python
def autoEnc(keySeq, data):
    if keySeq == 'aes':
        key = loadkey(k[keySeq])
        return aesEn(data, key[0])
    elif keySeq == 'rsa':
        key = loadkey(k[keySeq])
        return rsaEn(data, key[1])
    else:
        raise ValueError("Invalid key sequence")
```

这样,逻辑更加清晰,避免了不必要的字符串格式化。如果 `keySeq` 应该是一个特定的标识符,这应该可以解决问题。

为了验证这一点,我将运行这段修改后的代码,看看是否解决了类型错误。假设 `k` 正确地映射了 'aes' 和 'rsa' 到它们各自的密钥,那么这个函数应该能够根据 `keySeq` 的值正确地调用 `aesEn` 或 `rsaEn`。

经过这些更改后,错误应该不再出现,因为不再进行有问题的字符串格式化比较。相反,我们基于 `keySeq` 的值进行明确的条件判断。

因此,关键在于确保 `keySeq` 被正确使用,并且比较操作符合其预期的类型和值。通过重构代码以明确 `keySeq` 的预期用途,我们避免了类型错误并提高了代码的可读性和可靠性。


0

技术

2

魅力

1

原创

略有小成

Rank: 4

积分
1011
人气
14
分享
0

最佳新人

 楼主| 发表于 2025-1-11 16:29:39 | 显示全部楼层
问题已解决

0

技术

0

魅力

0

原创

初出茅庐

Rank: 2

积分
217
人气
0
分享
0
发表于 2025-1-14 08:14:58 | 显示全部楼层

感谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表