Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

__fspath__() function in PathLike object

I'm trying to implement a PathLike object and use fspath command to retrieve the o/p from fspath function.

What I'm expecting is, if a PathLike object is passed to fspath function, it should return the value of fspath (here it should return the path in bytes). However, it is still returning in 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/'

Can you please let me know where I went wrong and how should I change the code so that it works as expected?

like image 995
Surya Teja Vemparala Avatar asked Sep 07 '25 08:09

Surya Teja Vemparala


1 Answers

The problem is that you’re calling fspath on re.path instead of on re.

While re is a pathlike object, for which fspath will use the __fspath__ protocol, re.path is just a string, so it returns the string unchanged.

As the docs say:

If str or bytes is passed in, it is returned unchanged. Otherwise __fspath__() is called and its value is returned as long as it is a str or bytes object. In all other cases, TypeErroris raised.

Meanwhile, your __fspath__ is wrong in two ways. First it’s a method, which should take self and do something with self.path; as-is, you’re taking that self as a variable named path and trying to use it as a string. Second, you have to call encode on your string (with the appropriate encoding—which is usually the fs encoding, although in that case you don’t even need to bother and can just return a string), not pass it to the bytes constructor.

Also, for debugging purposes, it would had been a lot easier to spot the problem if your string and bytes were completely unrelated. If, say, re.path were 'unicodepath' while __fspath__ returned ’8bitpath', it would be pretty clear whether it was ignoring your method or deciding things behind your back.

like image 166
abarnert Avatar answered Sep 09 '25 17:09

abarnert