While reading through python. I came across some python only terms. And a very odd syntax using * and **. And then there is this @ symbol called decorator.
Positional and Keyword Arguments
Lets start with positional argument. This is pertaining to how a normal function with arguments is define.
# POSITIONAL ARGUMENT (conventional)
def myfunc(a,b,c):
print a + b + c
myfunc(1,2,3)
# Output: 123
"""
In this example a normal function is called , with their argument in order of a ,b ,c. This is positional and very common in any programming languages.
"""
# KEYWORD ARGUMENT
def myfunc(a,b,c)
print a + b + c
myfunc(c=3,b=2,a=1)
# Output: 123
"""
In this example same function definition, but the arguments are reflecting the argument names in the function thus the same output regardless of order.
"""
*args and **kwargs (unpacking)
Now lets look at *args, in other programming languages we can have optional arguments like in C# eg. main(string[] arg) or C++ main(int argc, char [] *argv) or main(int argc ,char ** argv).
So its basically similar with python see below:
def myfunc(*argv)
argc = len(argv)
for x in argv:
print (x)
myfunc(1,2,3)
# output:
1
2
3
** args is a bit similar above. It lets the caller specify the name of the argument. Confused? See below
def myfunc(**kwargs)
print (a + b + c)
myfunc(a=1,b=2,c=3)
# Output: 123
# See what happens there? another way to access is
def myfunc(**kwargs)
for key in kwargs:
print (kwargs[key])
myfunc(a=1,b=2,c=3)
# Output:
1
2
3
# You can also use to unpack collections and provide to the function
# using *args for a list or tuple
def myfunc(arg1, arg2, arg3):
print (arg1 + arg2 + arg3)
mytup = (1,2,3)
myfunc(*mytup)
# Output: 123
# using **args for dictionary
def myfunc(**args):
print (arg1 + arg2 + arg3)
mydict = {"arg1":1, "arg2":2, "arg3":3 }
myfunc(**mydict)
# Output: 123
@ Decorators
We will start with an example first below as this is the best way to explain it.
def mydecor(another_func):
print ("Im in first")
another_func()
print ("Im in last")
@mydecor
def thisfunc():
print ("I am in the middle")
thisfunc
# Note: Do not call it like this thisfunc() check this for information:
https://www.thecodeship.com/patterns/guide-to-python-function-decorators/
#What is happening is another_func() will call the "thisfunc" function thus you dont need the "()" when calling it.
# Output:
Im in first
Im am in the middle
Im in last