Function overloading in Python: Missing [closed]

杀马特。学长 韩版系。学妹 提交于 2019-11-26 19:49:45

As unwind noted, keyword arguments with default values can go a long way.

I'll also state that in my opinion, it goes against the spirit of Python to worry a lot about what types are passed into methods. In Python, I think it's more accepted to use duck typing -- asking what an object can do, rather than what it is.

Thus, if your method may accept a string or a tuple, you might do something like this:

def print_names(names):
    """Takes a space-delimited string or an iterable"""
    try:
        for name in names.split(): # string case
            print name
    except AttributeError:
        for name in names:
            print name

Then you could do either of these:

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

Although an API like that sometimes indicates a design problem.

vartec

Now, unless you're trying to write C++ code using Python syntax, what would you need overloading for?

I think it's exactly opposite, overloading is only necessary to make strongly typed languages act more like Python. In Python you have keyword argument, you have *args and **kwargs.

See for example: What is a clean, pythonic way to have multiple constructors in Python?

you don't need function overloading, as you have the *args and **kwargs arguments.

The fact is that function overloading is based on the idea that passing different types you will execute different code. If you have a dynamically typed language like python, you should not distinguish by type, but you should deal with interfaces and their compliance with the code you write.

For example, if you have code that can handle either an integer, or a list of integers, you can try iterating on it and if you are not able to, then you assume it's an integer and go forward. Of course it could be a float, but as far as the behavior is concerned, if a float and an int appear to be the same, then they can be interchanged.

Oftentimes you see the suggestion use use keyword arguments, with default values, instead. Look into that.

You can pass a mutable container datatype into a function, it can contain anything you want.

If you need a different functionality, name the functions differently, or if U need a same interface, just write a interface function (or method) that calls the functions appropriately based on the data received.

It took a while to me to get adjusted to this coming from Java, But it really isnt a "big handicap"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!