\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}