Pycharm 预期类型为 'optional[bytes]',但实际得到的是 'str'。

17

我正在使用rsplit来拆分路径名。

rootPath = os.path.abspath(__file__)
rootPath = (rootPath.rsplit('/', 1)[0]).rsplit('/', 1)[0]

但是 Pycharm 给出了警告:

期望类型为 optional [bytes],实际得到的是 str

Python 文档中,它说明了使用 sep 作为分隔符字符串。

那么如何修复这个问题呢?

3个回答

13

看起来rootPath被视为字节对象(可能是个小错误?)或警告是针对其他部分的。

总体而言,PyCharm和错误本质上是在提醒你该参数必须是Nonebytes。这就是Optional的意思,Optional[type]None或类型type,在你的情况下是bytes

在简单的Python REPL中,消息略有不同,但要点相同:

b'hello/world'.rsplit('/') # error bytes-like object required

你需要提供一个 byte 分隔符:

b'hello/world'.rsplit(b'/') 

为了让它工作,需要使用 None

要么PyCharm中有一个小错误,它在这里错误地报告了rsplit,要么警告是针对你代码的另一部分。


0

我之前遇到过这个问题:

import subprocess

result = subprocess.run(
    "ls /etc/systemd/system",
    shell=True, capture_output=True, text=True
)

for line in result.stdout.split("\n"):
    if "banana" in line:
        print(line.split(".")[0].strip().split("_"))

PyCharm开始高亮显示:"\\n"、"banana"、"."、"_":

PyCharm flagging strings as wrong

它表示期望 Optional[bytes]Union[bytes,int],但是这段代码在 Python 3.10、3.9 和 3.8 中都可以正常运行。

我怀疑是最近选择了“设置->编辑器->检查->代码兼容性检查”,所以我将其禁用并重新启动了该窗口,但无济于事。

我在.stdout之后添加了 .decode() 来转换字节。这使 PyCharm 安静了下来,但又带来了一些噪音。在 Python 3.10 中,.stdout 不是 bytes 而是 str,我会收到一个错误:

AttributeError: 'str' object has no attribute 'decode'.

在 Python 文档中,我发现bytesstr 中的方法名称相同。


0

我也曾遇到同样的问题,但找到了一个稍有不同的解决方案 - 我想为那些未来可能遇到相同问题的人添加这个解决方案。

rootPath = os.path.abspath(__file__)
rootPath = str(rootPath.rsplit('/', 1)[0]).rsplit('/', 1)[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接