Pycharm预期的型别是'optional[bytes]',但得到的是'str'

kokeuurv  于 2022-11-08  发布在  PyCharm
关注(0)|答案(3)|浏览(689)

我使用rsplit来拆分路径名,

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

但是Pycharm警告说
应为类型optional [bytes],但得到了str
python doc中,它使用sep作为分隔符字符串 * 来表示 *。
那么如何解决这个问题呢?

2ic8powd

2ic8powd1#

看起来rootPath被当作一个字节对象(可能是一个小错误?),或者警告是针对另一部分的。
一般来说,PyCharm和error警告你的是参数必须是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中有一个小bug,它在这里错误地报告了rsplit,或者警告是针对代码的另一部分。

2izufjch

2izufjch2#

我带着同样的问题来到这里,发现了一个略有不同的解决方案-想到为任何可能在未来陷入同样问题的人添加它。

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

juzqafwq3#

我之前看到这个:

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”、“香蕉”、.""、“_":

它说它需要Optional[bytes]Union[bytes,int],然而这段代码在python 3.10、3.9和3.8中运行得非常好。
我怀疑这是我最近选择的设置-〉编辑器-〉检查-〉代码兼容性检查,所以我禁用了它,并重新启动该窗口无济于事。
我在.stdout后面添加了.decode()来转换字节。这会使PyCharm安静下来,但是会产生噪音。在python 3.10中,.stdout不是bytes,而是str,我会得到一个错误:
属性错误:“str”对象没有属性“decode”。
在python文档中,我发现了与str中相同的方法名(以字节为单位

相关问题