How to know function return type and argument types?
Solution 1:
Well things have changed a little bit since 2011! Now there's type hints in Python 3.5 which you can use to annotate arguments and return the type of your function. For example this:
def greeting(name):
return 'Hello, {}'.format(name)
can now be written as this:
def greeting(name: str) -> str:
return 'Hello, {}'.format(name)
As you can now see types, there's some sort of optional static type checking which will help you and your type checker to investigate your code.
for more explanation I suggest to take a look at the blog post on type hints in PyCharm blog.
Solution 2:
This is how dynamic languages work. It is not always a good thing though, especially if the documentation is poor - anyone tried to use a poorly documented python framework? Sometimes you have to revert to reading the source.
Here are some strategies to avoid problems with duck typing:
- create a language for your problem domain
- this will help you to name stuff properly
- use types to represent concepts in your domain language
- name function parameters using the domain language vocabulary
Also, one of the most important points:
- keep data as local as possible!
There should only be a few well-defined and documented types being passed around. Anything else should be obvious by looking at the code: Don't have weird parameter types coming from far away that you can't figure out by looking in the vicinity of the code...
Related, (and also related to docstrings), there is a technique in python called doctests
. Use that to document how your methods are expected to be used - and have nice unit test coverage at the same time!
Solution 3:
I attended a coursera course, there was lesson in which, we were taught about design recipe.
Below docstring format I found preety useful.
def area(base, height): '''(number, number ) -> number #**TypeContract** Return the area of a tring with dimensions base #**Description** and height >>>area(10,5) #**Example ** 25.0 >>area(2.5,3) 3.75 ''' return (base * height) /2
I think if docstrings are written in this way, it might help a lot to developers.
Link to video [Do watch the video] : https://www.youtube.com/watch?v=QAPg6Vb_LgI
Solution 4:
Actually there is no need as python is a dynamic language, BUT if you want to specify a return value then do this
def foo(a) -> int: #after arrow type the return type
return 1 + a
In the example above it will return int if you will give a string perimeter such as "hello"
to it then it will throw this exception TypeError: unsupported operand type(s) for +: 'int' and 'str'
because it has asked for a int value and we gave it a string value and lastly because we can't add int and string
and then for argument type do this
def foo(a: int) -> int:
return a+ 1
after the colon (:
)you can specify the argument type