PathLike 对象中的 __fspath__() 函数

Sur*_*ala 2 python filesystems parsing path

我正在尝试实现一个 PathLike 对象并使用 fspath 命令从fspath函数中检索 o/p 。

我期望的是,如果 PathLike 对象被传递给 fspath 函数,它应该返回fspath的值(这里它应该以字节为单位返回路径)。但是,它仍然在 str 中返回。

import os,pathlib
class imp(os.PathLike):
 def __init__(self,path):
  self.path=path
 def __fspath__(path):
  return bytes(path)
re=imp('/etc/')
print(os.fspath(re.path))

Output: '/etc/'

Expected output : b '/etc/'
Run Code Online (Sandbox Code Playgroud)

你能告诉我我哪里出错了,我应该如何更改代码以使其按预期工作?

aba*_*ert 5

问题是您正在调用fspathonre.path而不是 on re

Whilere是一个类似路径的对象,fspath它将使用__fspath__协议,re.path只是一个字符串,因此它返回字符串不变。

正如文档所说:

如果传入strbytes,则原样返回。否则__fspath__()调用并返回其值,只要它是一个strbytes对象。在所有其他情况下,TypeError被提出。

同时,你__fspath__在两个方面是错误的。首先它是一个方法,它应该采取self和做一些事情self.path;照self原样,您将其视为命名的变量path并尝试将其用作字符串。其次,你必须调用encode你的字符串(使用适当的编码——通常是 fs 编码,尽管在这种情况下你甚至不需要打扰并且可以只返回一个字符串),而不是将它传递给bytes构造函数。

此外,出于调试目的,如果您的字符串和字节完全无关,那么发现问题会容易得多。比如说,如果re.path'unicodepath'同时__fspath__返回’8bitpath',这将它是否被忽略你的方法或决定你背后的东西是相当清楚的。