There's a small amount of overhead to overloading:
- 2x conditionals
- 1x function call overhead (additional stack frame)

Instead of this approach we could either
- inline the existing contents of _load by indenting within the conditional
- just add the new code at the top of the function
- use multiple dispatch

```python
import os
import json
import pathlib

def test_load(n):
    print(('n', n, load))
    with open('test.json','w') as f:
        json.dump(True, f)
    assert load('test.json')
    assert load(pathlib.Path('test.json'))
    with open('test.json', 'r') as f:
        assert load(f)


def _load(file_, **kwargs):
    # ... rename existing json.load to json._load ...
    print(('load', file_, kwargs))
    return True

def load(file_, *, encoding="UTF-8", **kwargs):
    if isinstance(file_, str) or hasattr(file_, "__fspath__"):
        with open(os.fspath(file_), "r", encoding=encoding) as f:
            return _load(f, **kwargs)
    else:
        return _load(file_, **kwargs)

test_load(1)


def load(file_, *, encoding="UTF-8", **kwargs):
    if isinstance(file_, str) or hasattr(file_, "__fspath__"):
        with open(os.fspath(file_), "r", encoding=encoding) as f:
            return _load(f, **kwargs)
    return _load(file_, **kwargs)  # (or inline the existing json.load)


test_load(2)

## singledispatch
#
https://docs.python.org/3/library/functools.html?highlight=dispatch#functools.singledispatch

from functools import singledispatch


@singledispatch
def load(file_, **kwargs):
    return _load(file_, **kwargs)


@load.register(str)
def load_str(file_: str, *, encoding='UTF-8', **kwargs):
    with open(file_, "r", encoding=encoding) as f:
        return _load(f, **kwargs)


@load.register(os.PathLike)
def load_pathlike(file_: os.PathLike, *, encoding='UTF-8', **kwargs):
    with open(os.fspath(file_), "r", encoding=encoding) as f:
        return _load(f, **kwargs)


test_load(3)
```


On Thu, Sep 17, 2020 at 10:08 PM Inada Naoki <songofaca...@gmail.com> wrote:

> On Fri, Sep 18, 2020 at 12:07 AM Paolo Lammens <lammenspa...@gmail.com>
> wrote:
> >
> > Besides, I don't understand what the downside of overloading is, apart
> from purism (?).
>
> I am one of who are conservative about overloading. I agree this is
> purism, but I want to explain behind of this purism.
>
> In statically, and nominal typed language, overloading is simple and
> clear because only one type is chosen by compiler.
> On the other hand, compiler or VM can not choose single type in
> duck-typed (or structural typed) languages.
>
> For example,
>
> * str subtype can implement read/write method. It is both of PathLike
> and file-like.
> * File subtype can implement `.__fspath__`. It is both of PathLike and
> File.
>
> Of course, statically typed languages like Java allow implementing
> multiple interfaces. But Java programmer must choose one interface
> explicitly when it is ambiguous. So it is explicit what type is used
> in overloading.
>
> On the other hand, in case of Python, there are no compiler/VM support
> for overloading, because Python is duck-typed language.
>
> * `load(f, ...)` uses `f.read()`
> * `dump(f, ...)` uses `f.write()`
> * `loadf(path, ..)` and `dumpf(path, ...)` uses `open(path, ...)`
>
> This is so natural design for duck-typed language.
>
> Regards,
> --
> Inada Naoki  <songofaca...@gmail.com>
> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@python.org
> https://mail.python.org/mailman3/lists/python-ideas.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-ideas@python.org/message/ZZOHJITXXEYEAW37KM6JB3HWS54TOFU6/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/T44GJS722K7CNRAS2LYOIPY7QNQX7FVD/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to