summaryrefslogtreecommitdiff
path: root/advanced_python/04_only_kwargs.tex
blob: 8d4caef73e47b68baabd44e8efe18c716d6dc065 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
\documentclass[14pt,compress,aspectratio=169]{beamer}

\input{macros.tex}

\title[only kwargs]{Advanced Python}
\subtitle{Keyword-only arguments}

\author[FOSSEE] {The FOSSEE Group}

\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
\date[] {Mumbai, India}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}[fragile, plain]
  \frametitle{Motivation}
  \vspace*{-0.1in}
  \begin{itemize}
  \item One can mix positional and keyword arguments
  \end{itemize}
  \begin{lstlisting}
In []: def f(a, b=2):
  ...:     print(a, b)

In []: f(a=2, b=3)
2 3

In []: f(b=2, a=3)
3 2

In []: f(10, 20)
1 2
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Motivation}
  \begin{itemize}
  \item Function changes: positional arguments change in order or number
  \item Accidentally passing an extra argument
  \item Can we have purely keyword arguments?

    \vspace*{0.5in}
  \item Yes, in Python 3.x!
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Keyword-only arguments}
  \begin{lstlisting}
In []: def f(a, *args, b=False):
  ...:    print(a, args, b)

In []: f(1, 20)
1 (20,) False

In []: f(1, b=20)
1 () 20
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Keyword-only arguments}
 \noindent Without any extra arguments:
\vspace*{0.25in}
  \begin{lstlisting}
In []: def f(a, *, b=False):
  ...:    print(a, b)

In []: f(1, 20)
TypeError: f() takes 1 positional arg...
\end{lstlisting}
\pause
  \begin{lstlisting}
In []: f(1, b=20)
1 20
  \end{lstlisting}
\end{frame}

\begin{frame}
  \frametitle{Discussion}
  \begin{itemize}
  \item Solves the problem nicely
  \item \typ{b}: can only be specified as keyword argument

  \item Cannot be called as a positional argument
  \end{itemize}
\end{frame}


\end{document}