On Mon, Apr 11, 2016 at 9:27 AM, Nick Coghlan <ncogh...@gmail.com> wrote: > On 11 April 2016 at 02:16, Ethan Furman <et...@stoneleaf.us> wrote: >> >> 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 that isn't > interoperable with most other APIs (which is fine - anyone writing low > level POSIX-specific code can deal with unpacking the values > explicitly, it just won't happen implicitly anywhere). >
While I'm also tempted to lean towards 'marginalizing bytes support', it seems a little bit dangerous to me. Currently, os.path is heavily based on duck typing of str and bytes, so there may be code out there that does all kinds of things with paths without knowing whether it deals with bytes or str objects. If such code gets in contact with this pathname protocol, it will raise an exception whenever it happens to be fed a bytes path. That is, if the approach of 'partial support' is taken. And still there is the question I just posted in another branch of this mess: Who should use os.fspathname(...)? If it's os.path.* and other traditional (low-level?) functions that deal with paths, then fspathname should, in the name of backwards compatiblity, be able to deal with bytes and return bytes in those cases. Otherwise fspathname would do nothing for you, and all the work of isinstance/hasattr/whatever would be left to the caller of os.fspathname (or maybe this is what you want?). So a somewhat useful fspathname might indeed look something like this: def fspathname(pathlike) -> Union[str, bytes]: pathname = getattr(pathlike, '__fspathname__', pathlike) if not isinstance(pathname, (str, bytes)): raise TypeError("your thing is not pathlike") return pathname But maybe it is enough to have the __fspathname__ attribute, and make fspathname() some internal implementation detail of os.path.* and the like. -Koos _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com