[Python-Dev] Pathlib enhancements - acceptable inputs and outputs for fspath and os.fspath() (original) (raw)

Ethan Furman ethan at stoneleaf.us
Mon Apr 11 12🔞01 EDT 2016


On 04/10/2016 11:27 PM, Nick Coghlan wrote:

On 11 April 2016 at 02:16, Ethan Furman <ethan at stoneleaf.us> wrote:

DirEntry can still get the check, it can just throw TypeError when it represents a binary path (that's one of the advantages of using a method-based protocol - exceptions on method calls are more acceptable than exceptions on property access).

I guess I don't see the point of this. Either DirEntry's [1] only get partial support (which is only marginally better than the no support pathlib currently has), or stdlib code will need to catch those errors and then do an isinstance check to see if knows what the type is and how to deal with it [1]. What's wrong with only gaining partial support? Standard library code that doesn't currently support DirEntry at all will gain the ability to support str-based DirEntry objects, while bytes-based DirEntry objects will continue to be a low level object [...]

Let's consider to functions, one that accepts bytes/str for the path, and one that only accepts str:

str-only support

before new protocol

def do_fritz(a_path): if not isinstance(a_path, str): raise TypeError('str required') ...

after new protocol with str-only support

def do_fritz(a_path): a_path = fspath(a_path) ...

after new protocol with bytes/str support

   a_path = fspath(a_path)
   if not isinstance(a_path, str):
       raise TypeError('str required')
   ...

bytes/str support

before new protocol

def zingar(a_path): if not isinstance(a_path, (bytes,str)): raise TypeError('bytes or str required') ...

after new protocol with str-only support

def zingar(a_path): if not isinstance(a_path, bytes): try: a_path = fspath(a_path) except FSPathError: raise TypeError('bytes or str required') ...

after new protocol with bytes/str support

def zingar(a_path): a_path = fspath(a_path) if not isinstance(a_path, (bytes,str)): raise TypeError('bytes or str required') ...

If those examples are anywhere close to accurate, an fspath protocol that supported both bytes and str seems a lot easier to work with.

-- Ethan



More information about the Python-Dev mailing list