tag:blogger.com,1999:blog-60938813883843106822024-03-15T18:09:20.139-07:00程式扎記This is a blog to track what I had learned and share knowledge with all who can take advantage of themJohnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.comBlogger2352125tag:blogger.com,1999:blog-6093881388384310682.post-40816033227953131282022-11-26T22:45:00.003-08:002022-11-26T22:45:20.288-08:00[Git 常見問題] error: The following untracked working tree files would be overwritten by merge<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://blog.csdn.net/qing101hua/article/details/46312795" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5543" title="Double click to edit"><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>方案1:</b></span></span><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: brown;">// x -----删除忽略文件已经对 git 来说不识别的文件<br />// d -----删除未被添加到 git 的路径中的文件<br />// f -----强制运行</span><br /><b>#</b> <span style="color: blue;">git clean -d -fx</span></blockquote><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>方案2:</b></span></span><br />今天在服务器上 <span style="color: blue;">git pull </span>是出现以下错误:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5399.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5399.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5399.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5399.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">error: Your local changes to the following files would be overwritten by merge: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> application/config/config.php </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> application/controllers/home.php </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Please, commit your changes or stash them before you can merge. </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Aborting </span></li></ol></div>不知道什么原因造成的代码冲突,处理方法如下. 如果希望保留生产服务器上所做的改动,仅仅并入新配置项:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>$</b> <span style="color: blue;">git stash</span><br /><b>$</b> <span style="color: blue;">git pull</span><br /><b>$</b> <span style="color: blue;">git stash pop</span></blockquote><br />然后可以使用 <span style="color: blue;">git diff -w +文件名</span> 来确认代码自动合并的情况. 如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>$</b> <span style="color: blue;">git reset --hard</span><br /><b>$</b> <span style="color: blue;">git pull</span></blockquote><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>方案3:</b></span></span><br /><br /><span style="font-size: 14px; line-height: normal;"><span style="color: green;"><b>第 1 个问题: 解决 GIT 代码仓库不同步.</b></span></span><br />今天在执行 <span style="color: blue;">git pull </span>时出现:<br /><img border="0" src="https://drive.google.com/uc?id=1s0_b-Nx3CNDzFtWrUXdE4ZeTSi_8IEH3" style="border: 0px;" /><br /><br /><b>解决方法:</b> 执行 <span style="color: blue;">git checkout -f</span>,然后再执行 <span style="color: blue;">git pull</span> 重新 checkout.<br /><br /><span style="font-size: 14px; line-height: normal;"><span style="color: green;"><b>第 2 个问题: git pull 的默认地址问题.</b></span></span><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">1. git 处于 master 这个 branch 下时,默认的 remote 就是 origin;<br />2. 当在 master 这个 brach 下使用指定 remote 和 merge 的 git pull 时,使用默认的 remote 和 merge。</blockquote><br /><br />但是对于自己建的项目,并用 push 到远程服务器上,并没有这块内容,需要自己配置。 如果直接运行 git pull,会得到如此结果:<br /><img border="0" src="https://drive.google.com/uc?id=1LnWJMGIwPoKfblx7mc-hrGUok29QOBCb" style="border: 0px;" /><br /><br />解决方法, 通过 <span style="color: blue;">git config</span> 进行如下配置:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>$</b> <span style="color: blue;">git remote add -f origin <a class="snap_shots" href="mailto:git@192.168.21.44" style="color: #01336b; text-decoration-line: none;">git@192.168.21.44</a>:rest.git</span><br /><b>$</b> <span style="color: blue;">git config branch.master.remote origin</span><br /><b>$</b> <span style="color: blue;">git config branch.master.merge refs/heads/master</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-58520876601696815392022-10-08T23:24:00.004-07:002022-10-08T23:24:42.249-07:00[Mockito] Mockito’s Mock Methods<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source from <a class="snap_shots" href="https://www.baeldung.com/mockito-mock-methods" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5542" title="Double click to edit"><br /><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Overview</b></span></span><br />In this tutorial, we'll <b>illustrate the various uses of the standard static mock methods of the Mockito API</b>.<br /><br />As in other articles focused on the Mockito framework (<span style="color: brown;">like <a class="snap_shots" href="https://www.baeldung.com/mockito-verify" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Mockito Verify</u></a> or <a class="snap_shots" href="https://www.baeldung.com/mockito-behavior" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Mockito When/Then</u></a></span>), the MyList class shown below will be used as the collaborator to be mocked in test cases:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">package</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> mockito.prac.p3; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> java.util.AbstractList; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">extends</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> AbstractList<String>{ </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Override</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String get(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> index) { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">null</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Override</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> size() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Simple Mocking</b></span></span><br />The simplest overloaded variant of the mock method is the one with a single parameter for the class to be mocked:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> <T> T mock(Class<T> classToMock) </span></span></li></ol></div>We'll use this method to mock a class and set an expectation:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">MyList listMock = Mockito.mock(MyList.</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">when(listMock.add(anyString())).thenReturn(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li></ol></div>Then we'll execute a method on the mock:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">boolean</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> added = listMock.add(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li></ol></div>The following code confirms that we invoked the <i>add </i>method on the mock. The invocation returns a value that matches the expectation we set before:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">verify(listMock).add(anyString()); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">assertEquals(added, <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li></ol></div><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Mocking With Mock's Name</b></span></span><br />In this section, we'll cover another variant of the mock method, which is provided with an argument specifying the name of the mock:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> <T> T mock(Class<T> classToMock, String name) </span></span></li></ol></div>Generally speaking, the name of a mock has nothing to do with the working code. However, it may be <b>helpful in debugging, as we use the mock's name to track down verification errors</b>. To ensure the exception message thrown from an unsuccessful verification includes the provided name of a mock, we'll use <span style="color: blue;">assertThatThrownBy</span>.<br /><br />In the following code, we'll create a mock for the <span style="color: blue;"><b>MyList</b></span> class and name it <i>myMock</i>:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">MyList listMock = Mockito.mock(MyList.</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"myMock"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li></ol></div>Then we'll set an expectation on a method of the mock and execute it:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">when(listMock.add(anyString())).thenReturn(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">listMock.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li></ol></div>Next, we'll call the verification inside the <span style="color: blue;">assertThrows</span> and verify the instance of the exception thrown:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">assertThrows( </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> TooFewActualInvocations.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> () -> verify(listMock, times(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)).add(anyString())); </span></span></li></ol></div>Further, we can also <b>verify the exception's message that it should contain the information about the mock</b>:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">TooFewActualInvocations exception = assertThrows( </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> TooFewActualInvocations.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> () -> verify(listMock, times(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)).add(anyString())); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">assertTrue(exception.getMessage().contains(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"myMock.add"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)); </span></span></li></ol></div><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Mocking With Answer</b></span></span><br /><b>Here we'll demonstrate the use of a mock variant in which we'll configure the strategy for the mock's answers to interaction at creation time.</b> This <span style="color: blue;">mock</span> method's signature in the Mockito documentation looks like the following:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> <T> T mock(Class<T> classToMock, Answer defaultAnswer) </span></span></li></ol></div>Let's start with the definition of an implementation of the <span style="color: violet;"><b>Answer</b></span> interface:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> CustomAnswer </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">implements</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Answer<Boolean> { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Override</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Boolean answer(InvocationOnMock invocation) </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">throws</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Throwable { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div>We'll use the <span style="color: blue;"><b>CustomAnswer</b></span> class above for the generation of a mock:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">MyList listMock = Mockito.mock(MyList.</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> CustomAnswer()); </span></span></li></ol></div><b>If we don't set an expectation on a method, the default answer, configured by the <span style="color: blue;">CustomAnswer</span> type, will come into play</b>. In order to prove this, we'll skip over the expectation setting step and jump to the method execution:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">boolean</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> added = listMock.add(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li></ol></div>The following verification and assertion confirm that the mock method with an <span style="color: violet;"><b>Answer</b></span> argument worked as expected:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">verify(listMock).add(anyString()); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">assertFalse(added); </span></li></ol></div><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Mocking With MockSettings</b></span></span><br />The final mock method we'll cover in this article is the variant with a parameter of the <span style="color: violet;"><b>MockSettings</b></span> type. We use this overloaded method to provide a non-standard mock.<br /><br />There are several custom settings supported by methods of the <span style="color: violet;"><b>MockSettings</b></span> interface, such as registering a listener for method invocations on the current mock with <i>invocationListeners</i>, configuring serialization with <i>serializable</i>, specifying the instance to spy on with <i>spiedInstance</i>, configuring Mockito to attempt to use a constructor when instantiating a mock with <i>useConstructor,</i> etc.<br /><br />For convenience, we'll reuse the <span style="color: blue;"><b>CustomAnswer</b></span> class introduced in the previous section to create a <span style="color: violet;"><b>MockSettings</b></span> implementation that defines a default answer.<br /><br /><b>A <span style="color: violet;">MockSettings</span> object is instantiated by a factory method:</b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">MockSettings customSettings = withSettings().defaultAnswer(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> CustomAnswer()); </span></span></li></ol></div>We'll use that setting object in the creation of a new mock:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">MyList listMock = Mockito.mock(MyList.</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, customSettings); </span></span></li></ol></div>Similar to the preceding section, we'll invoke the <span style="color: blue;">add</span> method of a <span style="color: blue;"><b>MyList</b></span> instance, and verify that the mock method with a <span style="color: violet;"><b>MockSettings</b></span> argument works as expected:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">boolean</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> added = listMock.add(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">verify(listMock).add(anyString()); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">assertFalse(added); </span></li></ol></div><br /><br /><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Complete Source Code</b></span></span><br />The full unit test is as below:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5398.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">package</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> mockito.prac.p3; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.junit.Assert.assertEquals; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.junit.Assert.assertFalse; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.junit.Assert.assertThrows; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.junit.Assert.assertTrue; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.ArgumentMatchers.anyString; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.Mockito.times; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.Mockito.verify; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.Mockito.when; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.Mockito.withSettings; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.junit.jupiter.api.Test; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.MockSettings; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.Mockito; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.exceptions.verification.TooFewActualInvocations; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.invocation.InvocationOnMock; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> org.mockito.stubbing.Answer; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> UsingMockMethod { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> testSimpleMocking() { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList listMock = Mockito.mock(MyList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> when(listMock.add(anyString())).thenReturn(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">boolean</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> added = listMock.add(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> verify(listMock).add(anyString()); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(added, <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> testMockingWithMockName() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList listMock = Mockito.mock(MyList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"myMock"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> when(listMock.add(anyString())).thenReturn(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> listMock.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> TooFewActualInvocations exception = assertThrows( </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> TooFewActualInvocations.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> () -> verify(listMock, times(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)).add(anyString())); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertTrue(exception.getMessage().contains(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"myMock.add"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> CustomAnswer </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">implements</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Answer<Boolean> { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Override</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Boolean answer(InvocationOnMock invocation) </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">throws</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Throwable { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">false</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> testMockingWithAnswer() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList listMock = Mockito.mock(MyList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> CustomAnswer()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">boolean</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> added = listMock.add(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> verify(listMock).add(anyString()); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertFalse(added); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> testMockingWithMockSettings() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MockSettings customSettings = withSettings().defaultAnswer(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> CustomAnswer()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList listMock = Mockito.mock(MyList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, customSettings); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">boolean</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> added = listMock.add(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"abc"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> verify(listMock).add(anyString()); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertFalse(added); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><i><span class="gensmall" style="font-size: 10px;">This message was edited 17 times. Last update was at 09/10/2022 14:24:01</span></i></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-33984726175924685732022-09-24T07:33:00.002-07:002022-09-24T07:33:11.818-07:00[Mockito] Using Spies<p> <a class="snap_shots" href="https://www.baeldung.com/mockito-spy" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>article source</b></a></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>1. Overview</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px; line-height: normal;"><b>In this tutorial, we'll illustrate how to make the most out of spies in Mockito.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">We'll talk about the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation and how to stub a spy. Finally, we'll go into the difference between Mock and Spy. Of course, for more Mockito goodness, </span><a class="snap_shots" href="https://www.baeldung.com/tag/mockito/" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><u>have a look at the series here</u></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>2. Simple Spy Example</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px; line-height: normal;"><b>Let's start with a simple example of how to use a spy.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Simply put, the API is </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>Mockito</b>.spy()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> (</span><a class="snap_shots" href="https://javadoc.io/static/org.mockito/mockito-core/4.7.0/org/mockito/Mockito.html#spy" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">more</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">) to spy on a real object. This will allow us to call all the normal methods of the object while still tracking every interaction, just as we would with a mock. Now let's do a quick example where we'll spy on an existing </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>MyList</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> object:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> List<String> innerList = </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ArrayList<String>(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> add(String element) { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> innerList.add(element); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> size() {</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> innerList.size();} </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenSpyingOnList_thenCorrect() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList list = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList spyList = Mockito.spy(list); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(spyList.size(), <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Note how the real method </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">add()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is actually called and how the size of </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">spyList</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> becomes 2.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>3. The @Spy Annotation</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Next, let's see how to use the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation. We can use the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation instead of </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">spy()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. To enable Mockito annotations (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">such as</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">,</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> … </span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">), we need to do one of the following:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>*</b> Call the method <span style="color: blue;"><b>MockitoAnnotations</b>.initMocks(this)</span> to initialize annotated fields<br /><b>*</b> Use the built-in runner <span style="color: blue;">@RunWith(MockitoJUnitRunner.class)</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Then:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Spy</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MyList aSpyList = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUsingTheSpyAnnotation_thenObjectIsSpied() { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MockitoAnnotations.initMocks(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">this</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> aSpyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> aSpyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(aSpyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(aSpyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(aSpyList.size(), <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>4. Stubbing a Spy</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px; line-height: normal;"><b>Now let's see how to stub a Spy. We can configure/override the behavior of a method using the same syntax we would use with a mock.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Here we'll use </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">doReturn()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> to override the </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">size()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> method:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenStubASpy_thenStubbed() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList list = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList spyList = Mockito.spy(list); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spyList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.doReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">).when(spyList).size(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(spyList.size(), <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>5. Mock vs Spy in Mockito</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px; line-height: normal;"><b>Let's discuss the difference between Mock and Spy in Mockito. We won't examine the theoretical differences between the two concepts, just how they differ within Mockito itself.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">When Mockito creates a mock, it does so from the Class of a Type, not from an actual instance.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> The mock simply creates a bare-bones shell instance of the Class, entirely instrumented to track interactions with it. On the other hand, </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">the spy will wrap an existing instance. It will still behave in the same way as the normal instance; the only difference is that it will also be instrumented to track all the interactions with it.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Here we'll create a mock of the </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>MyList</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> class:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenCreateMock_thenCreated() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList mockedList = Mockito.mock(MyList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mockedList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(mockedList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, mockedList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">As we can see, adding an element into the mocked list doesn't actually add anything; it just calls the method with no other side effects. A spy, on the other hand, will behave differently; it will actually call the real implementation of the add method and add the element to the underlying list:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenCreateSpy_thenCreate() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList spyList = Mockito.spy(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spyList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>6. Understanding the Mockito NotAMockException</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px; line-height: normal;"><b>In this final section, we'll learn about the Mockito NotAMockException. This exception is one of the common exceptions we will likely encounter when misusing mocks or spies.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Let's start by understanding the circumstances in which this exception can occur:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">List<String> list = </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ArrayList<String>(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Mockito.doReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">).when(list).size(); </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">When we run this code snippet, we'll get the following error:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">org.mockito.exceptions.misusing.NotAMockException: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Argument passed to when() is not a mock! </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Example of correct stubbing: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> doThrow(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> RuntimeException()).when(mock).someMethod(); </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Thankfully, it is quite clear from the Mockito error message what the problem is here. In our example, the list object is not a mock. The Mockito </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">when()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> method expects a mock or spy object as the argument.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">As we can also see, the Exception message even describes what a correct invocation should look like. Now that we have a better understanding of what the problem is, let's fix it by following the recommendation:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5397.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> List<String> spyList = Mockito.spy(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ArrayList<>()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">assertThatNoException().isThrownBy(() -> Mockito.doReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">).when(spyList).size()); </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Our example now behaves as expected, and we no longer see the Mockito </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>NotAMockException</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-83788251352653623162022-09-16T20:53:00.001-07:002022-09-16T20:53:02.776-07:00[Mockito] Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><a class="snap_shots" href="https://www.baeldung.com/mockito-annotations" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">article source</a></b></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>1. Overview</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In this tutorial, we'll cover the following annotations of the Mockito library: </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Captor</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, and </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@InjectMocks</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. For more Mockito goodness, have a look at </span><a class="snap_shots" href="https://www.baeldung.com/tag/mockito/" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">the series here</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>2. Enable Mockito Annotations</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Before we go further, let's explore different ways to enable the use of annotations with Mockito tests.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>MockitoJUnitRunner</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The first option we have is to annotate the JUnit test with a </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">MockitoJUnitRunner</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@RunWith</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">(MockitoJUnitRunner.</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MockitoAnnotationTest { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>MockitoAnnotations.openMocks()</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Alternatively, we can enable Mockito annotations programmatically by invoking </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">MockitoAnnotations.openMocks()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Before</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> init() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MockitoAnnotations.openMocks(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">this</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>MockitoJUnit.rule()</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Lastly, we can use a </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">MockitoJUnit.rule()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MockitoInitWithMockitoJUnitRuleUnitTest { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Rule</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MockitoRule initRule = MockitoJUnit.rule(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In this case, we </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">must remember to make our rule public</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>3. @Mock Annotation</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The most widely used annotation in Mockito is </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. We can </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">use</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">to create and inject mocked instances without having to call <span style="color: blue;">Mockito.mock</span> manually</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. In the following example, we'll create a mocked </span><a class="snap_shots" href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ArrayList.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>ArrayList</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> manually without using the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenNotUseMockAnnotation_thenCorrect() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> List mockList = Mockito.mock(ArrayList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mockList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(mockList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, mockList.size()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.when(mockList.size()).thenReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, mockList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now we'll do the same, but we'll inject the mock using the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Rule</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MockitoRule initRule = MockitoJUnit.rule(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Mock</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">List<String> mockedList; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUseMockAnnotation_thenMockIsInjected() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mockedList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(mockedList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, mockedList.size()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.when(mockedList.size()).thenReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, mockedList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Note how in both examples, we're interacting with the mock and verifying some of these interactions, just to make sure that the mock is behaving correctly.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>4. @Spy Annotation</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now let's see how to use the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation to spy on an existing instance.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In the following example, we create a spy of a List without using the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList{ </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> List<String> innerList = </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ArrayList<String>(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> add(String element) { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> innerList.add(element); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> size() {</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> innerList.size();} </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenNotUseSpyAnnotation_thenCorrect() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList spyList = Mockito.spy(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> UsingMockAnnotTest.MyList()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spyList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spyList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spyList.size()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.doReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">).when(spyList).size(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spyList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now we'll do the same thing, spy on the list, but we'll use the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><span style="color: orange;">@Spy</span> </b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">annotation:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Spy</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MyList spiedList = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyList(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spiedList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> spiedList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spiedList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(spiedList).add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"two"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spiedList.size()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.doReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">).when(spiedList).size(); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">100</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spiedList.size()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Note how, as before, we're interacting with the spy here to make sure that it behaves correctly. In this example we:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">*</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Used the real method </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">spiedList.add()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> to add elements to the </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">spiedList</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">*</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Stubbed the method </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">spiedList.size()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> to return 100 instead of 2 using </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Mockito.doReturn()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>5. @Captor Annotation</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Next let's see how to use the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Captor</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation to create an </span><a class="snap_shots" href="https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>ArgumentCaptor</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> instance.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In the following example, we'll create an </span><a class="snap_shots" href="https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>ArgumentCaptor</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> without using the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Captor</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenNotUseCaptorAnnotation_thenCorrect() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyList mockList = Mockito.mock(MyList.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ArgumentCaptor<String> arg = ArgumentCaptor.forClass(String.<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mockList.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(mockList).add(arg.capture()); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, arg.getValue()); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now let's make use of </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Captor</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> for the same purpose, to create an </span><a class="snap_shots" href="https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>ArgumentCaptor</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> instance:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Mock</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MyList mockedList2; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Captor</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">ArgumentCaptor<String> argCaptor; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUseCaptorAnnotation_thenTheSam() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mockedList2.add(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.verify(mockedList2).add(argCaptor.capture()); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"one"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, argCaptor.getValue()); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Notice how the test becomes simpler and more readable when we take out the configuration logic.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>6. @InjectMocks Annotation</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now let's discuss how to use the </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@InjectMocks</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> annotation to inject mock fields into the tested object automatically.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In the following example, we'll use </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@InjectMocks</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> to inject the mock </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">wordMap</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> into the </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>MyDictionary</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">dic</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. Here is the class </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>MyDictionary</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Map<String, String> wordMap; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wordMap = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> HashMap<String, String>(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> add(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String word, </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String meaning) { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wordMap.put(word, meaning); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String getMeaning(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String word) { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> wordMap.get(word); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Then is our unit test case:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Mock</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Map<String, String> wordMap; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@InjectMocks</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MyDictionary dic = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUseInjectMocksAnnotation_thenCorrect() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.when(wordMap.get(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aWord"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)).thenReturn(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aMeaning"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aMeaning"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, dic.getMeaning(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aWord"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>7. Injecting a Mock Into a Spy</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Similar to the above test, we might want to </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">inject a mock into a spy</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Mock</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Map<String, String> wordMap; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Spy</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MyDictionary spyDic = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary(); </span></span></li></ol></div><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">However, Mockito doesn't support injecting mocks into spies</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, and the following test results in an exception:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUseInjectMocksAnnotation_thenCorrect() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.when(wordMap.get(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aWord"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)).thenReturn(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aMeaning"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aMeaning"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spyDic.getMeaning(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aWord"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If we want to use a mock with a spy, we can manually inject the mock through a constructor:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MyDictionary(Map<String, String> wordMap) { </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">this</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">.wordMap = wordMap; </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Instead of using the annotation, we can now create the spy manually:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">static</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Map<String, String> wordMap; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary(Map<String, String> aMap) { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">this</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">.wordMap = aMap; </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary() { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wordMap = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> HashMap<String, String>(); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> add(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String word, </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String meaning) { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wordMap.put(word, meaning); </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String getMeaning(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">final</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> String word) { </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> wordMap.get(word); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Mock</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Map<String, String> mockWordMap; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenUseInjectMocksAnnotation_thenCorrectPart2() { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> MyDictionary spyDic = Mockito.spy(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">new</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyDictionary(mockWordMap)); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.when(mockWordMap.get(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aWord"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)).thenReturn(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aMeaning"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> assertEquals(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aMeaning"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, spyDic.getMeaning(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"aWord"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)); </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The test will now pass.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>8. Running Into NPE While Using Annotation</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Often </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">we may run into <span style="color: blue;">NullPointerException</span> when we try to actually use the instance annotated with</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Mock</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> or </span><span style="background-color: #fafafa; color: orange; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>@Spy</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5396.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MockitoAnnotationsUninitializedUnitTest { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Mock</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> List<String> mockedList; </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@Test</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">(expected = NullPointerException.</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">public</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">void</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> whenMockitoAnnotationsUninitialized_thenNPEThrown() { </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Mockito.when(mockedList.size()).thenReturn(<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">); </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li></ol></div><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Most of the time, this happens simply because <span style="color: red;">we forget to properly enable Mockito annotations</span>.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">So we have to keep in mind that </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">each time we want to use Mockito annotations, we must take the extra step and initialize them as we already explained earlier.</b>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-48232465791053356192022-02-03T19:17:00.002-08:002022-02-03T19:17:23.206-08:00[ Python 常見問題 ] How can I get the IP address from NIC in Python?<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source from <a class="snap_shots" href="https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-from-nic-in-python" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5537" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />So how can I get the IP address of specific network interface in Python?<br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br /><br /><span style="font-size: 14px; line-height: normal;"><span style="color: green;"><b>Method #1</b></span> </span>(<span style="color: brown;">use external package</span>)<br />You need to ask for the IP address that is bound to your <i>eth0</i> interface. This is available from the <a class="snap_shots" href="https://pypi.python.org/pypi/netifaces/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>netifaces package</b></a>. Before all, let's check out network interfaces:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">ip addr show</span><br /><span style="color: green;">...<br />2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000<br />link/ether 00:0c:29:9f:e6:d5 brd ff:ff:ff:ff:ff:ff<br />altname enp2s1<br /><b>inet 192.168.37.131/24 brd 192.168.37.255</b> scope global dynamic noprefixroute ens33<br />valid_lft 1672sec preferred_lft 1672sec<br />inet6 fe80::6b54:4ab:9041:4fcd/64 scope link noprefixroute<br />valid_lft forever preferred_lft forever</span></blockquote><br />Then check below code snippet for how to retrieve IP address:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b><span style="color: blue;"> import netifaces as ni</span><br /><b>>>></b> <span style="color: blue;">from pprint import pprint</span><br /><b>>>></b> <span style="color: blue;">pprint(ni.ifaddresses('ens33'))</span><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1261.85px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5393.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5393.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5393.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5393.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">{</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: [{</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'addr'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'192.168.37.131'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'broadcast'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'192.168.37.255'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'netmask'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'255.255.255.0'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">}], </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">10</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: [{</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'addr'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'fe80::6b54:4ab:9041:4fcd%ens33'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'netmask'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'ffff:ffff:ffff:ffff::'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">}], </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">17</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: [{</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'addr'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'00:0c:29:9f:e6:d5'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'broadcast'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'ff:ff:ff:ff:ff:ff'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">}]} </span></span></li></ol></div><br /><b>>>></b> <span style="color: blue;">ni.ifaddresses('ens33')[ni.AF_INET][0]['addr']</span><br /><span style="color: green;">'192.168.37.131'</span><br /><b>>>></b> <span style="color: blue;">ni.interfaces()</span><br /><span style="color: green;">['lo', 'ens33', 'br-85c9ddfa802f', 'docker0', 'br-1f95accf9779', 'br-227986c2fe47']</span></blockquote><br /><span style="font-size: 14px; line-height: normal;"><span style="color: green;"><b>Method #2</b></span></span> (<span style="color: brown;">no external package</span>)<br />Here's a way to get the IP address without using a python package:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">import socket</span><br /><b>>>></b> <span style="color: blue;">import fcntl</span><br /><b>>>></b> <span style="color: blue;">import struct</span><br /><b>>>></b> <span style="color: blue;">socket.gethostbyname(socket.gethostname())</span><br /><span style="color: green;">'127.0.1.1'</span><br /><b>>>></b> <span style="color: blue;">sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)</span><br /><b>>>></b> <span style="color: blue;">packed_iface = struct.pack('256s', 'ens33'.encode('utf_8'))</span><br /><b>>>></b> <span style="color: blue;">packed_addr = fcntl.ioctl(sock.fileno(), 0x8915, packed_iface)[20:24]</span><br /><b>>>></b> <span style="color: blue;">socket.inet_ntoa(packed_addr)</span><br /><span style="color: green;">'192.168.37.131'</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-91289320213884501472022-01-26T18:41:00.001-08:002022-01-26T18:41:02.328-08:00[ Python 常見問題 ] How to get symbolic link target in Python?<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/33232417/how-to-get-symlink-target-in-python/33235708" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5538" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />How do I extract the target path from a <a class="snap_shots" href="https://en.wikipedia.org/wiki/Symbolic_link" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>symbolic link</b></a>?<br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />The problem with <a class="snap_shots" href="https://docs.python.org/3/library/os.html#os.readlink" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>os</b>.readlink()</a> is it will only resolve 1 step of the link. We can have a situation where <i>A</i> links to another link <i>B</i>, and <i>B</i> link is dangling:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>$</b> <span style="color: blue;">ln -s /tmp/example/notexist /tmp/example/B</span><br /><b>$</b> <span style="color: blue;">ln -s /tmp/example/B /tmp/example/A</span><br /><b>$</b> <span style="color: blue;">ls -l /tmp/example</span><br /><span style="color: green;">A -> /tmp/example/B</span><br /><span style="color: green;">B -> /tmp/example/notexist</span></blockquote><br />Now in Python, <a class="snap_shots" href="https://docs.python.org/3/library/os.html#os.readlink" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>os</b>.readlink()</a> gives you the first target:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">import os</span><br /><b>>>></b> <span style="color: blue;">os.readlink('A')</span><br /><span style="color: green;">'/tmp/example/B'</span></blockquote><br />But in most situations I assume we are interested in the resolved path. So <a class="snap_shots" href="https://docs.python.org/3/library/pathlib.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>pathlib</b></a> can help here:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">from pathlib import Path</span><br /><b>>>></b> <span style="color: blue;">Path('A').resolve()</span><br /><span style="color: green;">PosixPath('/tmp/example/notexist')</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><i><span class="gensmall" style="font-size: 10px;">This message was edited 5 times. Last update was at 25/01/2022 20:27:24</span></i></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-88300559209478822042021-12-21T04:08:00.002-08:002021-12-21T04:08:05.281-08:00[ Python 常見問題 ] How to use glob() to find files recursively?<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/2186525/how-to-use-glob-to-find-files-recursively" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5534" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />This is what I have:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1293.53px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">glob(os.path.join(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)) </span></span></li></ol></div>but I want to search the subfolders of <span style="color: olive;">src</span>. Something like this would work:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1293.53px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">glob(os.path.join(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">glob(os.path.join(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">glob(os.path.join(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">glob(os.path.join(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">)) </span></span></li></ol></div>But this is obviously limited and clunky.<br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />Use <a class="snap_shots" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.rglob" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>pathlib.Path</b>.rglob</a> from the the <a class="snap_shots" href="https://docs.python.org/3/library/pathlib.html#module-pathlib" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>pathlib</b></a> module, which was introduced in Python 3.5.<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1293.53px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from pathlib </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Path </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> path in Path(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">).rglob(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(path.name) </span></li></ol></div>If you don't want to use <a class="snap_shots" href="https://docs.python.org/3/library/pathlib.html#module-pathlib" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>pathlib</b></a>, use can use <span style="color: blue;">glob.glob('**/*.c')</span>, but don't forget to pass in the <span style="color: violet;">recursive</span> keyword parameter and it will use inordinate amount of time on large directories.<br /><br />For cases where matching files beginning with a dot (.); like files in the current directory or hidden files on Unix based system, use the <a class="snap_shots" href="https://docs.python.org/3/library/os.html#os.walk" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>os</b>.walk</a> solution below. For older Python versions, use <a class="snap_shots" href="https://docs.python.org/3/library/os.html#os.walk" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>os</b>.walk</a> to recursively walk a directory and <a class="snap_shots" href="https://docs.python.org/3/library/fnmatch.html#fnmatch.filter" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>fnmatch</b>.filter</a> to match against a simple expression:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1293.53px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5390.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> fnmatch </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> os </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">matches = [] </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> root, dirnames, filenames in os.walk(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'src'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> filename in fnmatch.filter(filenames, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'*.c'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> matches.append(os.path.join(root, filename)) </span></li></ol></div></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-63016669035967500462021-11-05T22:05:00.004-07:002021-11-05T22:05:36.175-07:00[ Python 文章收集 ] Pydon't - Pass-by-value, reference, and assignment<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://mathspp.com/blog/pydonts/pass-by-value-reference-and-assignment" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Preface</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>When you call a function in Python and give it some arguments... Are they passed by value? No! By reference? No! They're <span style="color: darkblue;">passed by assignment</span>.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Many traditional programming languages employ either one of two models when passing arguments to functions:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>*</b> some languages use the <b>pass-by-value</b> model; and<br /><b>*</b> most of the others use the <b>pass-by-reference</b> model.</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Having said that, it is important to know the model that Python uses, because that influences the way your code behaves. </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In this Pydon't, you will</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>*</b> <b>See</b> that Python doesn't use the pass-by-value nor the pass-by-reference models;<br /><b>*</b> <b>Understand</b> that Python uses a pass-by-assignment model;<br /><b>* Learn</b> about the built-in function <a class="snap_shots" href="https://docs.python.org/3/library/functions.html#id" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">id</a>;<br /><b>* Create</b> a better understanding for the <a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>Python object model</b></a>;<br /><b>* Realise</b> that every object has 3 very important properties that define it;<br /><b>* Understand</b> the difference between mutable and immutable objects;<br /><b>* Learn </b>the difference between shallow and deep copies; and<br /><b>* Learn</b> how to use the module <a class="snap_shots" href="https://docs.python.org/3/library/copy.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>copy</b></a> to do both types of object copies.</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Is Python pass-by-value?</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>In the pass-by-value model, when you call a function with a set of arguments, the data is copied into the function.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> This means that you can modify the arguments however you please and that you won't be able to alter the state of the program outside the function.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This is not what Python does, </span><span style="background-color: #fafafa; color: darkred; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>Python does not use the pass-by-value model.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Looking at the snippet of code that follows, it might look like Python uses pass-by-value:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def foo(x): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> x = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">4</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">a = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">foo(a) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(a) # <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This looks like the pass-by-value model because we gave it </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">a</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> 3, changed it to a 4, and the change wasn't reflected on the outside (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>a</i> is still 3</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">).</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">But, in fact, Python is not copying the data into the function. To prove this, I'll show you a different function:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def clearly_not_pass_by_value(my_list): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> my_list[<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] = </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">42</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">l = [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">clearly_not_pass_by_value(l) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(l) # [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">42</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">As we can see, the list </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">l</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, that was defined outside of the function, changed after calling the function </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">clearly_not_pass_by_value</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. Hence, Python does not use a pass-by-value model.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Is Python pass-by-reference?</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>In a true pass-by-reference model, the called function gets access to the variables of the callee!</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Sometimes, it can look like that's what Python does, but </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><span style="color: darkred;">Python does not use the pass-by-reference model</span>.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">I'll do my best to explain why that's not what Python does:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def not_pass_by_reference(my_list): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> my_list = [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">42</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">73</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">l = [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">not_pass_by_reference(l) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(l) # [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If Python used a pass-by-reference model, the function would've managed to completely change the value of </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">l</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> outside the function, but that's not what happened, as we can see. Let me show you an actual pass-by-reference situation.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Here's some Pascal code:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5385.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">program callByReference; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">var </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> x: integer; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">procedure foo(var a: integer); </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">{ create a procedure called `foo` } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">begin </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> a := <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">6</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> { assign </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">6</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> to `a` } </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">end; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">begin </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> x := <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; { assign </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> to `x` } </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> writeln(x); { print `x` } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> foo(x); { call `foo` with `x` } </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> writeln(x); { print `x` } </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">end. </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Look at the last lines of that code:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>*</b> we assign 2 to <i>x</i> with <span style="color: blue;">x := 2</span>;<br /><b>*</b> we print <i>x</i>;<br /><b>*</b> we call <span style="color: blue;">foo</span> with <i>x</i> as argument; and<br /><b>*</b> we print <i>x</i> again.</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">What's the output of this program? If you run this, you'll see that the output is:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">2<br />6</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">which can be rather surprising, if the majority of your programming experience is in Python!</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Python object model</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>To really understand the way Python behaves when calling functions, it's best if we first understand what Python objects are, and how to characterise them.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: green;"><b>The three characteristics of objects</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In Python, everything is an object, and each object is characterised by three things:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>* its identity</b> (<span style="color: brown;">an integer that uniquely identifies the object, much like social security numbers identify people</span>);<br /><b>* a type</b> (<span style="color: brown;">that identifies the operations you can do with your object</span>); and<br /><b>* the object's content.</b></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Here is an object and its three characteristics:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">id(obj)</span><br /><span style="color: green;">2698212637504</span> <span style="color: brown;"># the identity of `obj`</span><br /><b>>>></b> <span style="color: blue;">type(obj)</span><br /><span style="color: green;"><class 'list'></span> <span style="color: brown;"># the type of `obj`</span><br /><b>>>></b> <span style="color: blue;">obj</span><br /><span style="color: green;">[1, 2, 3] </span><span style="color: brown;"># the contents of `obj`</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">As we can see above, </span><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#id" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">id</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is the built-in function you use to query the identity of an object, and </span><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#type" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">type</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is the built-in function you use to query the type of an object.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: green;"><b>(Im)mutability</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>The (im)mutability of an object depends on its type.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> In other words, (im)mutability is a characteristic of types, not of specific objects! But what exactly does it mean for an object to be mutable? Or for an object to be immutable?</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Recall that an object is characterised by its identity, its type, and its contents. </span><span style="background-color: #fafafa; color: darkred; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>A type is mutable if you can change the contents of its objects without changing its identity and its type.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Lists are a great example of a mutable data type. Why? Because lists are containers: you can put things inside lists and you can remove stuff from inside those same lists.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Below, you can see how the contents of the list </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">obj</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> change as we make method calls, but the identity of the list remains the same:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">obj = []</span><br /><b>>>></b> <span style="color: blue;">id(obj)</span><br /><span style="color: green;">2287844221184</span><br /><br /><b>>>></b> <span style="color: blue;">obj.append(0); obj.extend([1, 2, 3]); obj</span><br /><span style="color: green;">[42, 0, 1, 2, 3]</span><br /><b>>>></b> <span style="color: blue;">id(obj)</span><br /><span style="color: green;">2287844221184</span><br /><br /><b>>>></b> <span style="color: blue;">obj.pop(0); obj.pop(0); obj.pop(); obj</span><br /><span style="color: green;">42<br />0<br />3<br />[1, 2]</span><br /><b>>>></b> <span style="color: blue;">id(obj)</span><br /><span style="color: green;">2287844221184</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">However, when dealing with immutable objects, it's a completely different story. If we check an English dictionary, this is what we get for the definition of “immutable”:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">adjective: immutable – unchanging over time or unable to be changed.</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Immutable objects' contents never change. Take a string as an example:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">obj = "Hello, world!"</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; color: darkred; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>Strings are a good example for this discussion because, sometimes, they can look mutable. But they are not!</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">A very good indicator that an object is immutable is when all its methods return something.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> This is unlike list's </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.append</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> method, for example! If you use </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.append</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> on a list, you get no return value. On the other hand, </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">whatever method you use on a string, the result is returned to you</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">[].append(0)</span> <span style="color: brown;"># No return.</span><br /><b>>>></b> <span style="color: blue;">obj.upper() </span><span style="color: brown;"># A string is returned.</span><br /><span style="color: green;">'HELLO, WORLD!"</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Notice how </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">obj </i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">wasn't updated automatically to "HELLO, WORLD!". Instead,</span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> the new string was created and returned to you.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Another great hint at the fact that strings are immutable is that you cannot assign to its indices:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">obj[0]</span><br /><span style="color: green;">'H'</span><br /><b>>>></b> <span style="color: blue;">obj[0] = "h"</span><br /><span style="color: red;">Traceback (most recent call last):<br />File "<stdin>", line 1, in <module><br />TypeError: 'str' object does not support item assignment</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This shows that, when a string is created, it remains the same. It can be used to build other strings, but the string itself always. stays. unchanged.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Variable names as labels</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>Another important thing to understand is that a variable name has very little to do with the object itself.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In fact, the name </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">obj</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> was just a label that I decided to attach to the object that has identity 2698212637504, has the list type, and contents 1, 2, 3. Just like I attached the label </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">obj </i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">to that object, I can attach many more names to it:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">foo = bar = baz = obj</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Again, these names are just labels. Labels that I decided to stick to the same object. How can we know it's the same object? Well, all their “social security numbers” (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">the ids</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">) match, so they must be the same object:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">id(foo)</span><br /><span style="color: green;">2698212637504</span><br /><b>>>></b> <span style="color: blue;">id(bar)</span><br /><span style="color: green;">2698212637504</span><br /><b>>>></b> <span style="color: blue;">id(baz)</span><br /><span style="color: green;">2698212637504</span><br /><b>>>></b> <span style="color: blue;">id(obj)</span><br /><span style="color: green;">2698212637504</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Therefore, we conclude that <i>foo</i>, <i>bar</i>, <i>baz,</i> and <i>obj</i>, are variable names that all refer to the same object.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>The operator <i>is</i></b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>This is exactly what the operator <i>is</i> does: it checks if the two objects are the same.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">For two objects to be the same, they must have the same identity:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">foo is obj</span><br /><span style="color: green;">True</span><br /><b>>>></b> <span style="color: blue;">bar is foo</span><br /><span style="color: green;">True</span><br /><b>>>></b> <span style="color: blue;">obj is foo</span><br /><span style="color: green;">True</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">It is not enough to have the same type and contents:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">obj1 = [1, 2, 3]; obj2 = [1, 2, 3]</span><br /><b>>>></b> <span style="color: blue;">obj1 is obj2</span><br /><span style="color: green;">False</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Think of it in terms of perfect twins. When two siblings are perfect twins, they look identical. However, they are different people!</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Assignment as nicknaming</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If we keep pushing this metaphor forward, </span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>assigning variables is just like giving a new nickname to someone.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">My friends from middle school call me “Rojer”. My friends from college call me “Girão”. People I am not close to call me by my first name – “Rodrigo”. However, regardless of what they call me, I am still me, right?</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If one day I decide to change my haircut, everyone will see the new haircut, regardless of what they call me!</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In a similar fashion, if I modify the contents of an object, I can use whatever nickname I prefer to see that those changes happened. For example, we can change the middle element of the list we have been playing around with:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">john = ken = bob = [1, 2, 3]</span><br /><b>>>></b> <span style="color: blue;">john[1] = 42</span><br /><b>>>></b> <span style="color: blue;">ken</span><br /><span style="color: green;">[1, 42, 3]</span><br /><b>>>></b> <span style="color: blue;">bob</span><br /><span style="color: green;">[1, 42, 3]</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Because they all pointed at the same list object.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Python is pass-by-assignment</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Having laid out all of this, we are now ready to understand how Python passes arguments to functions. </span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><b>When we call a function, each of the parameters of the function is assigned to the object they were passed in. In essence, each parameter now becomes a new nickname to the objects that were given in</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: green;"><b>Immutable arguments</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If we pass in immutable arguments, then we have no way of modifying the arguments themselves. After all, that's what immutable means: “doesn't change”.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">That is why it can look like Python uses the pass-by-value model. Because the only way in which we can have the parameter hold something else is by assigning it to a completely different thing. When we do that, we are reusing the same nickname for a different object:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">mydict = dict.fromkeys(['a', 'b'], 1)</span><br /><b>>>></b> <span style="color: blue;">mydict</span><br /><span style="color: green;">{'a': 1, 'b': 1}</span><br /><b>>>></b> <span style="color: blue;">mydict['a'] = 0</span><br /><b>>>></b> <span style="color: blue;">mydict</span> <span style="color: brown;"># Now key 'a' and 'b' points to different object</span><br /><span style="color: green;">{'a': 0, 'b': 1}</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: green;"><b>Mutable arguments</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">On the other hand, mutable arguments can be changed. We can modify their internal contents. A prime example of a mutable object is a list: its elements can change (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">and so can its length</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">).</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">That is why it can look like Python uses a pass-by-reference model. However, when we change the contents of an object, we didn't change the identity of the object itself. Similarly, when you change your haircut or your clothes, your social security number does not change:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">mydict = dict.fromkeys(['a', 'b'], [])</span><br /><b>>>></b> <span style="color: blue;">mydict</span><br /><span style="color: green;">{'a': [], 'b': []}</span><br /><b>>>></b> <span style="color: blue;">mydict['a'].append(0)</span><br /><b>>>></b> <span style="color: blue;">mydict</span> <span style="color: brown;"># Both key 'a' and 'b' points to same list</span><br /><span style="color: green;">{'a': [0], 'b': [0]}</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="font-size: medium;"><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;">More topics (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif;">Making copies, Examples in code etc</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;">) can refer to </span><a class="snap_shots" href="https://mathspp.com/blog/pydonts/pass-by-value-reference-and-assignment#beware-when-calling-functions" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; text-decoration-line: none;" target="_new"><u>original post here</u></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;">.</span></span>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-36697879345068788112021-09-17T20:37:00.003-07:002021-09-17T20:37:34.261-07:00[ Python 常見問題 ] When using unittest.mock.patch, why is autospec not True by default?<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/35915703/when-using-unittest-mock-patch-why-is-autospec-not-true-by-default" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">When you patch a function using </span><a class="snap_shots" href="https://docs.python.org/3/library/unittest.mock.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>mock</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, you have the option to specify </span><span style="background-color: #fafafa; color: violet; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">autospec </span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">as True:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>If you set <span style="color: blue;">autospec=True</span> then the mock with be created with a spec from the object being replaced.</b> All attributes of the mock will also have the spec of the corresponding attribute of the object being replaced. Methods and functions being mocked will have their arguments checked and will raise a TypeError if they are called with the wrong signature.</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">(</span><a class="snap_shots" href="http://www.voidspace.org.uk/python/mock/patch.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_blank">http://www.voidspace.org.uk/python/mock/patch.html</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">)</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">I'm wondering why this isn't the default behavior?</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Surely we would almost always want to catch passing incorrect parameters to any function we patch?</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The only clear way to explain this, is to actually quote the </span><a class="snap_shots" href="https://docs.python.org/3.3/library/unittest.mock.html#auto-speccing" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><u>documentation</u></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> on the downside of using auto-speccing and why you should be careful when using it:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">This isn’t without caveats and limitations however, which is why it is not the default behaviour. In order to know what attributes are available on the spec object, autospec has to introspect (access attributes) the spec. As you traverse attributes on the mock a corresponding traversal of the original object is happening under the hood. If any of your specced objects have properties or descriptors that can trigger code execution then you may not be able to use autospec. On the other hand it is much better to design your objects so that introspection is safe [4].<br /><br /><span style="color: darkred;"><b>A more serious problem is that it is common for instance attributes to be created in the init method and not to exist on the class at all</b></span>. autospec can’t know about any dynamically created attributes and restricts the api to visible attributes.</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">I think the key takeaway here is to note this line: </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><span style="color: violet;">autospec</span> can’t know about any dynamically created attributes and restricts the api to visible attributes</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">So, to help being more explicit with an example of where autospeccing breaks, this example taken from the documentation shows this:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>>> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Something: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... def __init__(self): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... self.a = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">33</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">>>> with patch(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'__main__.Something'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, autospec=True): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... thing = Something() </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... thing.a </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">Traceback (most recent call last): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">AttributeError: Mock object has no attribute <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'a'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">As you can see, auto-speccing has no idea that there is an attribute a being created when creating your </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>Something</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> object. </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">There is nothing wrong with assigning a value to your instance attribute.<br /></b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Observe the below functional example:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5376.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> unittest </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">from mock <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> patch </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def some_external_thing(): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> pass </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def something(x): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> x </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyRealClass: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.a = some_external_thing() </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def test_thing(self): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> something(self.a) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyTest(unittest.TestCase): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def setUp(self): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.my_obj = MyRealClass() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@patch</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'__main__.some_external_thing'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@patch</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'__main__.something'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def test_my_things(self, mock_something, mock_some_external_thing): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mock_some_external_thing.return_value = <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"there be dragons"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.my_obj.a = mock_some_external_thing.return_value </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.my_obj.test_thing() </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mock_something.assert_called_once_with(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"there be dragons"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> __name__ == </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'__main__'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> unittest.main() </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">So, I'm just saying for my test case I want to make sure that the </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">some_external_thing()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> method does not affect the behaviour of my unittest, so I'm just assigning my instance attribute the mock per </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">mock_some_external_thing.return_value = "there be dragons"</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-5881906211518360262021-09-04T19:29:00.002-07:002021-09-04T19:29:56.338-07:00[ Bash 範例代碼 ] Scripts with pre-defined information<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://www.udemy.com/course/linux-bash-shell-scripting-through-real-life-examples/learn/lecture/17020012#overview" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">-<span style="color: olive;"> goscript.sh</span></b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/0/5375.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/0/5375.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/0/5375.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/0/5375.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read -r -p <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Enter name of script: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> script </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read -r -p <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Whats your fullname: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> fname </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read -r -p <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Whats the description of this script: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> description </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">script_dir_path=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$HOME/ps/"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ ! -d $script_dir_path ]; then </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> mkdir ${script_dir_path} </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">script_path=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"${script_dir_path}/${script}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Preparing ${script_path}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"#!/bin/bash"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> > </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"${script_path}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"###########################################"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> >> ${script_path} </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"#Author: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> $fname >> ${script_path} </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"#Date: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> $(date) >> ${script_path} </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"#Description: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> $description >> ${script_path} </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"#Modified: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> $(date) >> ${script_path} </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"###########################################"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> >> ${script_path} </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">chmod a+x ${script_path} </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">vim ${script_path} </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Supplement</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">* </span><a class="snap_shots" href="https://linuxize.com/post/bash-read/" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><u>Linuxize - Bash read Command</u></a>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-44516270272755312012021-09-03T03:25:00.000-07:002021-09-03T03:25:00.072-07:00[ Python 常見問題 ] Why do Python classes inherit object?<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/4015417/why-do-python-classes-inherit-object" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Is there any reason for a class declaration to inherit from object? I just found some code that does this and I can't find a good reason why.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> MyClass(object): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> # <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> code follows... </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Answer:</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In Python 3, apart from compatibility between Python 2 and 3, no reason. In Python 2, many reasons.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>Python 2.x story:</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In Python 2.x (from 2.2 onwards) there's two styles of classes depending on the presence or absence of object as a base-class:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">1. "classic" style classes:</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> they don't have object as a base class:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>>> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ClassicSpam: # no base </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... pass </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">>>> ClassicSpam.__bases__ </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">() </span></li></ol></div><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">2. "new" style classes:</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> they have, directly or indirectly (e.g inherit from a built-in type), object as a base class:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>>> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> NewSpam(object): # directly inherit from object </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... pass </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">>>> NewSpam.__bases__ </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">(<type <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'object'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>,) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">>>> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> IntSpam(</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): # indirectly inherit from object... </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">... pass </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">>>> IntSpam.__bases__ </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">(<type <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'int'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>,) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">>>> IntSpam.__bases__[<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">].__bases__ # ... because </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> inherits from object </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">(<type <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'object'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>,) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Without a doubt, when writing a class you'll always want to go for new-style classes. The perks of doing so are numerous, to list some of them:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">* <a class="snap_shots" href="https://docs.python.org/3/howto/descriptor.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">Support for descriptors</a>. Specifically, the following constructs are made possible with descriptors:</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#classmethod" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">classmethod:</a> A method that receives the class as an implicit argument instead of the instance.<br /><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#staticmethod" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">staticmethod</a>: A method that does not receive the implicit argument self as a first argument.<br />properties with <a class="snap_shots" href="https://docs.python.org/3/library/functions.html#property" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">property</a>: Create functions for managing the getting, setting and deleting of an attribute.<br />more...</blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">* The <a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html#object.__new__" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">__new__</a> static method: lets you customize how new class instances are created.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">* <a class="snap_shots" href="https://www.python.org/download/releases/2.3/mro/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">Method resolution order (MRO)</a>: in what order the base classes of a class will be searched when trying to resolve which method to call.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">* More</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If you don't inherit from </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">object</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, forget these. A more exhaustive description of the previous bullet points along with other perks of "new" style classes can be found </span><a class="snap_shots" href="https://www.python.org/download/releases/2.2.3/descrintro/" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><u>here</u></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">One of the downsides of new-style classes is that the class itself is more memory demanding. Unless you're creating many class objects, though, I doubt this would be an issue and it's a negative sinking in a sea of positives.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>Python 3.x story:</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In Python 3, things are simplified. Only new-style classes exist (referred to plainly as classes) so, the only difference in adding object is requiring you to type in 8 more characters. This:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ClassicSpam: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> pass </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">is completely equivalent (apart from their name :-) to this:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> NewSpam(object): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> pass </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">and to this:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Spam(): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> pass </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">All have object in their __bases__.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5374.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">>>> [object in cls.__bases__ </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> cls in {Spam, NewSpam, ClassicSpam}] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">[True, True, True] </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>So, what should you do?</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In Python 2: </b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">always inherit from </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">object</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> explicitly. Get the perks.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In Python 3:</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> inherit from </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">object</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> if you are writing code that tries to be Python agnostic, that is, it needs to work both in Python 2 and in Python 3. Otherwise don't, it really makes no difference since Python inserts it for you behind the scenes.</span>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-80414251567577867432021-08-28T04:53:00.002-07:002021-08-28T04:53:32.648-07:00[ Python 常見問題 ] What's the best way to split a string into fixed length chunks<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/18854620/whats-the-best-way-to-split-a-string-into-fixed-length-chunks-and-work-with-the" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5516" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />As title, I want a function as below:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">def split_text_into_n_chuck(text, n=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> pass </span></li></ol></div>So I can use it this way:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">text = 'abcdefghijk'</span><br /><b>>>></b> <span style="color: blue;">split_text_into_n_chuck(text)</span><br /><span style="color: green;">['ab', 'cd', 'ef', 'gh', 'ij', 'k']</span></blockquote><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />A simple implementation as below:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5372.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">def split_text_into_n_chuck(text, n=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [text[i:i+n] </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> i in range(</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, len(text), n)] </span></span></li></ol></div>For example:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">split_text_into_n_chuck(text, n=3)</span><br /><span style="color: green;">['abc', 'def', 'ghi', 'jk']</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-21402664870057820402021-08-28T04:45:00.000-07:002021-08-28T04:45:24.621-07:00[ Python 常見問題 ] Type hints with user defined classes<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/44664040/type-hints-with-user-defined-classes" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5515" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />Couldn't seem to find a definitive answer. I want to do a type hint for a function and the type being some custom class that I have defined, called it <span style="color: blue;"><b>CustomClass</b></span>. And then let's say in some function, call it <span style="color: blue;">FuncA(arg)</span>, I have one argument named <i>arg</i>. Would the correct way to type hint <span style="color: blue;">FuncA</span> be:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def FuncA(arg: CustomClass): </span></li></ol></div>Or would it be:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def FuncA(Arg:Type[CustomClass]): </span></li></ol></div><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />The former is correct, if <i>arg</i> accepts an instance of <span style="color: blue;"><b>CustomClass</b></span>:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def FuncA(arg: CustomClass): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> # ^ instance of CustomClass </span></li></ol></div>In case you want the class <span style="color: blue;"><b>CustomClass</b></span> itself (<span style="color: brown;">or a subtype</span>), then you should write:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from typing </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Type # you have to </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Type </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def FuncA(arg: Type[CustomClass]): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> # ^ CustomClass (<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> object) itself </span></span></li></ol></div>Like it is written in the documentation about <a class="snap_shots" href="https://docs.python.org/3/library/typing.html#typing.Type" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>Typing</b></a>:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1125.62px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> typing.Type(Generic[CT_co]) </span></span></li></ol></div>A variable annotated with <i>C </i>may accept a value of type <i>C</i>. In contrast, a variable annotated with <span style="color: blue;">Type[<i>C</i>]</span> may accept values that are classes themselves - specifically, it will accept the class object of <i>C</i>.</blockquote><br />The documentation includes an example with the <a class="snap_shots" href="https://docs.python.org/3/library/functions.html#int" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>int</b></a> class:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5371.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">a = </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> # Has type </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'int'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">b = <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> # Has type </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Type[int]'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">c = type(a) # Also has type <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Type[int]'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li></ol></div></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-14803295377436800192021-08-13T06:52:00.002-07:002021-08-13T06:52:17.648-07:00[ Python 常見問題 ] How should a python type hint require that a value has a given attribute?<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/57972163/how-should-a-python-type-hint-require-that-a-value-has-a-given-attribute" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Let's say I have a simple function like this:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def handle(d: People) -> None: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"{d.name}/{d.age}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">I would like type hinting People to check if the given object has attributes "name" (str) and "age" (int).</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This is exactly what </span><a class="snap_shots" href="https://www.python.org/dev/peps/pep-0544/" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>Protocols</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> are for. </span><span style="background-color: #fafafa; color: green; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>In short, Protocols let you use structural instead of nominal subtyping.</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> With nominal subtyping, type </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">A</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is a subtype of </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">B</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> if </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">A</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> explicitly inherits or extends </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">B</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. With structural subtyping, type </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">A</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is a subtype of </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">B</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> if it has the same method and attribute "signatures" as </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">B</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">with some restrictions</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">).</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">For example:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5368.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from typing </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Protocol </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> People(Protocol): </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> name: str </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> age: <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> P1: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self) -> None: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.name = <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'John'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.age = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> P2: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self) -> None: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.name = <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Ken'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.age = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">56</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.extra_attr = <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'test'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> P3: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self) -> None: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.name = <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Mary'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> P4: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self) -> None: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.age = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">99</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def handle(d: People) -> None: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"{d.name}/{d.age}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">handle(P1()) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">handle(P2()) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"P3"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> is missing following </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"People"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> protocol member: age </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">handle(P3()) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"P4"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> is missing following </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Device"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> protocol member: name </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">handle(P4()) </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">You can leverage </span><a class="snap_shots" href="https://mypy.readthedocs.io/en/stable/getting_started.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>mypy</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> to do the typing check:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">mypy test.py</span><br /><span style="color: red;">test.py:40: error: Argument 1 to "handle" has incompatible type "P3"; expected "People"</span><br /><span style="color: green;">test.py:40: note: "P3" is missing following "People" protocol member:<br />test.py:40: note: age</span><br /><span style="color: red;">test.py:42: error: Argument 1 to "handle" has incompatible type "P4"; expected "People"</span><br /><span style="color: green;">test.py:42: note: "P4" is missing following "People" protocol member:<br />test.py:42: note: name<br />Found 2 errors in 1 file (checked 1 source file)</span></blockquote><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">You can also find slightly more complex examples of using </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><a class="snap_shots" href="https://docs.python.org/3/library/typing.html#typing.Protocol" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">Protocol</a>s</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> in </span><a class="snap_shots" href="https://github.com/python/typeshed/blob/master/stdlib/3/typing.pyi#L83" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><u>typeshed, the repository of type hints for the Python standard library</u></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Though, I suppose this all matters only if you actually intend on using static analysis in your code. If not, you could maybe do something simpler and just define a custom type alias to </span><a class="snap_shots" href="https://docs.python.org/3/library/typing.html#typing.Any" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>Any</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, document what that alias is "supposed" to mean, and use that alias instead of a full-fledged protocol. That alias would be almost completely useless for the purposes of static analysis/autocompletion tools/etc, but humans generally have no issues reading comments.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Supplement</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">* </span><a class="snap_shots" href="https://stackoverflow.com/questions/43187829/is-there-a-way-to-make-flake8-check-for-type-hints-in-the-source" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><u>Is there a way to make flake8 check for type hints in the source</u></a>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-27851270144466436952021-08-01T03:54:00.003-07:002021-08-01T03:54:39.870-07:00[ Python 常見問題 ] How do I type hint a method with the type of the enclosing class?<p> <b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/33533148/how-do-i-type-hint-a-method-with-the-type-of-the-enclosing-class" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">I have the following code in python 3:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Position: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self, x: <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, y: </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.x = x </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.y = y </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __add__(self, other: Position) -> Position: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Position(self.x + other.x, self.y + other.y) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">But the return type hinting </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">def __add__(self, other: Position) -> Position</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> will fail.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If you are using Python 3.10 or later, it just works.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> As of today (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">2019</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">), in 3.7+ you must turn this feature on using a future statement (</span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">from __future__ import annotations</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">). In Python 3.6 or below, use a string.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">I guess you got this exception:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">NameError: name </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Position'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> is not defined </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This is because </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>Position</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> must be defined before you can use it in an annotation unless you are using Python 3.10 or later.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>Python 3.7+: from __future__ import annotations</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Python 3.7 introduces </span><a class="snap_shots" href="https://www.python.org/dev/peps/pep-0563/" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">PEP 563: postponed evaluation of annotations</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. A module that uses the future statement </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">from __future__ import annotations</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> will store annotations as strings automatically:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from __future__ </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> annotations </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Position: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __add__(self, other: Position) -> Position: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This is scheduled to become the default in Python 3.10. </span><span style="background-color: #fafafa; color: darkred; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>Since Python still is a dynamically typed language so no type checking is done at runtime, typing annotations should have no performance impact, right? Wrong!</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Before python 3.7 the typing module used to be </span><a class="snap_shots" href="https://www.python.org/dev/peps/pep-0560/#performance" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">one of the slowest python modules in core</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> so </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">if you import <a class="snap_shots" href="https://docs.python.org/3/library/typing.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">typing</a> you will see <a class="snap_shots" href="https://docs.python.org/3.7/whatsnew/3.7.html#pep-560-core-support-for-typing-module-and-generic-types" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">up to 7 times increase</a> in performance when you upgrade to 3.7.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: green;"><b>Python <3.7: use a string</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">According to </span><a class="snap_shots" href="https://www.python.org/dev/peps/pep-0484/#forward-references" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">PEP 484</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, you should use a string instead of the class itself:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/0/5366.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Position: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __add__(self, other: <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Position'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) -> </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Position'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li></ol></div>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com1tag:blogger.com,1999:blog-6093881388384310682.post-10159076105184927152021-07-31T18:00:00.002-07:002021-07-31T18:00:14.882-07:00[ Python 常見問題 ] Python type-hinting, indexable object<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/48283886/python-type-hinting-indexable-object" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5508" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />My function needs to accept an object, from which <b>data can be extracted by index, viz. a <a class="snap_shots" href="https://docs.python.org/3/tutorial/datastructures.html#more-on-lists" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">List</a> or an instance with defined <a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html#object.__getitem__" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">__getitem__</a> method.</b><br /><br /><b>Which type can I use for type hinting this argument?</b><br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />There are several different ways you can do this.<br /><br />If you're ok with using only custom classes (<span style="color: brown;">that you can write</span>) as <b>indexable containers</b>:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from typing </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> TypeVar, Generic </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">ReturnType = TypeVar(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'ReturnType'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> IndexableContainer(Generic[ReturnType]): </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __getitem__(self, key: <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) -> ReturnType: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def get_last_element(container: IndexableContainer[<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">]) -> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> container[-</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">my_container = [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(get_last_element(my_container)) </span></li></ol></div>Output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">3</span></blockquote><br />The issue is, of course, that if you wanted to pass in a plain old list into the function, <b>you wouldn't be able to do so since list doesn't subclass your custom type.</b><br /><br />We could maybe special-case certain inputs via clever use of the <span style="color: orange;"><b>@overload</b></span> decorator and unions, but there's a second, albeit experimental, way of doing this known as <a class="snap_shots" href="http://mypy.readthedocs.io/en/latest/class_basics.html#simple-user-defined-protocols" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>Protocols</b></a>.<br /><br /><b><a class="snap_shots" href="https://docs.python.org/3/library/typing.html#typing.Protocol" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">Protocols</a> basically let you express "duck typing" in a sane way using type hints</b>: the basic idea is that we can tweak <span style="color: blue;"><b>IndexableContainer</b></span> to become a protocol. Now, any object that implements the <span style="color: blue;">__getitem__</span> method with the appropriate signature is counted as a valid <span style="color: blue;"><b>IndexableContainer</b></span>, whether or not they subclass that type or not.<br /><br />The only caveat is that Protocols are currently experimental and (afaik) only supported by <a class="snap_shots" href="https://mypy.readthedocs.io/en/stable/getting_started.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>mypy</b></a>. The plan is to eventually add protocols to the general Python ecosystem -- see <a class="snap_shots" href="https://www.python.org/dev/peps/pep-0544/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">PEP 544 </a>for the specific proposal -- but I haven't kept track of the discussion/don't know what the status of that is.<br /><br />In any case, to use protocols, install the <a class="snap_shots" href="https://pypi.org/project/typing-extensions/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>typing_extensions</b></a> module using pip. Then, you can do the following:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from typing </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> TypeVar, Generic </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">from typing_extensions <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Protocol </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">ReturnType = TypeVar(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'ReturnType'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> IndexableContainer(Protocol, Generic[ReturnType]): </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __getitem__(self, key: <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) -> ReturnType: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ... </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def get_last_element(container: IndexableContainer[<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">]) -> </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> container[-</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">my_container = [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(get_last_element(my_container)) </span></li></ol></div>The last ane easier one is to use typing <span style="color: blue;"><b>Sequence</b></span>:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5364.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from typing </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> TypeVar, Sequence </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">EType = TypeVar(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'ElementType'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, str) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def get_last_element(container: Sequence[EType]) -> EType: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> container[-</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">my_int_container = [<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">,</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">my_str_container = [<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"a"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"b"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"c"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(get_last_element(my_int_container)) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">print(get_last_element(my_str_container)) </span></li></ol></div>Ouptut<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">3<br />c</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com1tag:blogger.com,1999:blog-6093881388384310682.post-39165439081654300362021-07-25T00:53:00.003-07:002021-07-25T00:53:50.768-07:00[ Bash 範例代碼 ] List logged user by date<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://www.udemy.com/course/linux-bash-shell-scripting-through-real-life-examples/learn/lecture/11613408#overview" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5505" title="Double click to edit"><b>- <span style="color: olive;">09-1_list_of_logged_users.sh</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5361.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5361.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5361.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5361.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Author: John Lee </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Date: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">25</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Description: This script will list users logged in by date </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Info: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># $ last | head -n <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># root pts/<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">192.168</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">.</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">37.1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Sun Jul </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">25</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">00</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">16</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> gone - no logout </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># root pts/<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">192.168</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">.</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">37.1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Sat Jul </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">18</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">41</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> - </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">20</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">33</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> (</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">01</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">51</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># root pts/<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">192.168</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">.</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">37.1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Fri Jul </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">23</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">23</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">00</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> - </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">05</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">13</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> (</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">06</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">:</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">13</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># e.g.: Sun Jul <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">25</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">today=`date | awk <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'{print $1,$2,$3}'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">` </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo -n <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Give month to search logged user(e.g: `date +'%b'`): "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read month </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo -n <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Give day to search logged user(e.g.: `date +'%d'`): "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read day </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ ! -z </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$month"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ] && [ ! -z </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$day"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]; then </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> tdate=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$month\s+$day\s+"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> tdate=$today </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> month=`date +<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'%b'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">` </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> day=`date +<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'%d'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">` </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Search logged user on date='$month $day'"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> u in `last | grep -P </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"${tdate}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> | awk </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'{print $1}'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> | sort | uniq` </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">do</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Found user '$u'"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">done </span></li></ol></div>Execution output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">last | grep -P 'Mon May\s+3\s+'</span><br /><span style="color: green;">root pts/1 192.168.37.1 Mon May 3 23:08 - 01:32 (02:24)<br />root pts/0 192.168.37.1 Mon May 3 22:18 - 03:49 (05:30)<br />john :0 :0 Mon May 3 22:18 - crash (13+01:54)<br />...</span><br /><br /><b>#</b> <span style="color: blue;">./09-1_list_of_logged_users.sh</span><br /><span style="color: green;">Give month to search logged user(e.g: Jul): </span><span style="color: blue;">May</span><br /><span style="color: green;">Give day to search logged user(e.g.: 25):</span> <span style="color: blue;">3</span><br /><span style="color: green;">Search logged user on date='May 3'<br />Found user 'john'<br />Found user 'reboot'<br />Found user 'root'<br />Found user 'wtmp'</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-15686090473682597652021-07-24T23:22:00.005-07:002021-07-24T23:22:59.438-07:00[Py Tricks] 2.3 Context Managers and the with Statement<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2T2HiDjQd0jdVfh_6Ucs6Q4bXujlt39L8WGG1vvXeFPXQBI01CINK6kKzvJZbJ7PgQFrEO4e7CFraDaWLs8aOOj_z5Hpgjdyz9yKbOFCY2hj5gBACf-RVJ7BNSWDONpOqfiQb_5x_Exs/s437/1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="437" data-original-width="314" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2T2HiDjQd0jdVfh_6Ucs6Q4bXujlt39L8WGG1vvXeFPXQBI01CINK6kKzvJZbJ7PgQFrEO4e7CFraDaWLs8aOOj_z5Hpgjdyz9yKbOFCY2hj5gBACf-RVJ7BNSWDONpOqfiQb_5x_Exs/s320/1.PNG" /></a></div><div class="separator" style="clear: both; text-align: center;"><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-align: left;">Source From <a class="snap_shots" href="https://realpython.com/products/python-tricks-book/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Preface</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The </span><a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>with statement</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> in Python is regarded as an obscure feature by some. But when you peek behind the scenes, you’ll see that there’s no magic involved, and it’s actually a highly useful feature that can help you write cleaner and more readable Python code.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">So what’s the </span><a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b><i>with </i>statement</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> good for? </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">It helps simplify some common resource management patterns by abstracting their functionality and allowing them to be factored out and reused</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. A good way to see this feature used effectively is by looking at examples in the Python standard library. The built-in </span><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#open" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">open()</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> function provides us with an excellent use case:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">with open(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello.txt'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'w'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) as f: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello, world!'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Opening files using the with statement is generally recommended because </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">it ensures that open file descriptors are closed automatically after program execution leaves the context of the <i>with</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. Internally, the above code sample translates to something like this:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">f = open(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello.txt'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'w'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">try</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello, world'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">finally</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.close() </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">You can already tell that this is quite a bit more verbose. Note that the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>try...finally</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is significant. It wouldn’t be enough to just write something like this:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">f = open(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello.txt'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'w'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello, world'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">f.close() </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This implementation won’t guarantee the file is closed if there’s an exception during the </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">f.write()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> call—and therefore our program might leak a file descriptor. That’s why the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>with</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> is so useful.</span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> It makes properly acquiring and releasing resources a breeze.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Another good example where the with statement is used effectively in the Python standard library is the </span><a class="snap_shots" href="https://docs.python.org/3/library/threading.html#lock-objects" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>threading</b>.Lock</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> class:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">some_lock = threading.Lock() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Harmful: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">some_lock.acquire() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">try</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> # Do something... </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">finally</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> some_lock.release() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Better: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">with some_lock: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> # Do something... </span></li></ol></div><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In both cases, using a <i>with</i> statement allows you to abstract away most of the resource handling logic.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Instead of having to write an explicit </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>try...finally</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> each time, using the </span><a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b><i>with</i> statement</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> takes care of that for us.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The <i>with</i> statement can make code that deals with system resources more readable.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> It also helps you avoid bugs or leaks by making it practically impossible to forget to clean up or release a resource when it’s no longer needed.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Supporting <i>with</i> in Your Own Objects</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now, there’s nothing special or magical about the </span><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#open" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">open()</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> function or the </span><a class="snap_shots" href="https://docs.python.org/3/library/threading.html#lock-objects" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>threading</b>.Lock</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> class and the fact that they can be used with a </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>with</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. You can provide the same functionality in your own classes and functions by implementing so-called </span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; line-height: normal;"><span style="color: darkblue;"><b>context managers</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">What’s a context manager? It’s a simple “protocol” (or interface) that your object needs to follow in order to support the <a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><i>with</i> statement</a></b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">. Basically, all you need to do is add </span><a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html#object.__enter__" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">__enter__</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> and </span><a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html#object.__exit__" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">__exit__</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> methods to an object if you want it to function as a context manager. Python will call these two methods at the appropriate times in the resource management cycle.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Let’s take a look at what this would look like in practical terms. Here’s what a simple implementation of the </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">open()</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> context manager might look like:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ManagedFile: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self, name): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.name = name </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __enter__(self): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.file = open(self.name, <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'w'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> self.file </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __exit__(self, exc_type, exc_val, exc_tb): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> self.file: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.file.close() </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Our </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>ManagedFile</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> class follows the context manager protocol and now supports the </span><a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b><i>with</i> statement</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">, just like the original </span><a class="snap_shots" href="https://docs.python.org/3/library/functions.html#open" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">open()</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> example did:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">with ManagedFile(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello.txt'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) as f: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello, world!'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'bye now'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Python calls </span><a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html#object.__enter__" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">__enter__</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> when execution enters the context of the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>with</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> and it’s time to acquire the resource. When execution leaves the context again, Python calls </span><a class="snap_shots" href="https://docs.python.org/3/reference/datamodel.html#object.__exit__" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new">__exit__</a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> to free up the resource.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Writing a class-based context manager isn’t the only way to support the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>with</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> in Python. The </span><a class="snap_shots" href="https://docs.python.org/3/library/contextlib.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>contextlib</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> utility module in the standard library provides a few more abstractions built on top of the basic context manager protocol. This can make your life a little easier if your use cases match what’s offered by </span><a class="snap_shots" href="https://docs.python.org/3/library/contextlib.html" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>contextlib</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">For example, you can use the </span><a class="snap_shots" href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>contextlib.contextmanager</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> decorator to define a generator-based factory function for a resource that will then automatically support the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>with</i> statement.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> Here’s what rewriting our </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><b>ManagedFile</b></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> context manager example with this technique looks like:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">from contextlib import contextmanager</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@contextmanager</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def managed_file(name): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">try</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f = open(name, <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'w'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> yield f </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">finally</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.close() </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Example usage:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">with managed_file(</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello.txt'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) as f: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello, world!'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f.write(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'bye now'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">In this case, </span><span style="background-color: #fafafa; color: blue; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">managed_file() </span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">is a generator that first acquires the resource. After that, it temporarily suspends its own execution and yields the resource so it can be used by the caller. When the caller leaves the </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">with</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> context, the generator continues to execute so that any remaining clean-up steps can occur and the resource can get released back to the system.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">The class-based implementation and the generator-based one are essentially equivalent. You might prefer one over the other, depending on which approach you find more readable.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">A downside of the <span style="color: orange;">@contextmanager</span>-based implementation might be that it requires some understanding of advanced Python concepts like <a class="snap_shots" href="https://realpython.com/primer-on-python-decorators/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">decorators</a> and <a class="snap_shots" href="https://realpython.com/introduction-to-python-generators/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">generators</a>.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> If you need to get up to speed with those, feel free to take a detour to the relevant chapters here in this book.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Once again, making the right implementation choice here comes down to what you and your team are comfortable using and what you find the most readable.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Writing Pretty APIs With Context Managers</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Context managers are quite flexible, and if you use the with statement creatively, you can define convenient APIs for your modules and classes.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">For example, what if the “resource” we wanted to manage was text indentation levels in some kind of report generator program? What if we could write code like this to do it:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">with Indenter() as indent: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> indent.print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hi!'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> with indent: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> indent.print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hello'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> with indent: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> indent.print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'bonjour'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> indent.print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'hey'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">This almost reads like a </span><a class="snap_shots" href="https://en.wikipedia.org/wiki/Domain-specific_language" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b>domain-specific language</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> (</span><span style="background-color: #fafafa; color: brown; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">DSL</span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">) for indenting text. Also, notice how this code enters and leaves the same context manager multiple times to change indentation levels. Running this code snippet should lead to the following output and print neatly formatted text to the console:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">hi! </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> hello </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> bonjour </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">hey </span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">So, how would you implement a context manager to support this functionality?</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">By the way, this could be a great exercise for you to understand exactly how context managers work. So before you check out my implementation below, </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">you might want to take some time and try to implement this yourself as a learning exercise.</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">If you’re ready to check out my implementation, here’s how you might implement this functionality using a class-based context manager:</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5360.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Indenter: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.level = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __enter__(self): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.level += <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> self </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __exit__(self, exc_type, exc_val, exc_tb): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.level -= <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def print(self, text): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' '</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> * self.level + text) </span></span></li></ol></div><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">That wasn’t so bad, was it? I hope that by now you’re already feeling more comfortable using context managers and the </span><b style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"><i>with</i> statement</b><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> in your own Python programs. They’re an excellent feature that will allow you to deal with resource management in a much more Pythonic and maintainable way.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Key Takeaways</b></span></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"></span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">• The </span><a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b><i>with</i> statement</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> simplifies exception handling by encapsulating standard uses of try/finally statements in so-called context managers.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">• Most commonly it is used to manage the safe acquisition and release of system resources. Resources are acquired by the </span><a class="snap_shots" href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow" style="background-color: #fafafa; color: #01336b; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; text-decoration-line: none;" target="_new"><b><i>with</i> statement</b></a><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> and released automatically when execution leaves the </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">with</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> context.</span><br style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" /><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">• Using </span><i style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">with</i><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;"> effectively can help you avoid resource leaks and make your code easier to read.</span>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-334681171720906162021-07-23T21:08:00.004-07:002021-07-23T21:08:26.364-07:00[ Bash 範例代碼 ] Delete old files<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://www.udemy.com/course/linux-bash-shell-scripting-through-real-life-examples/learn/lecture/11583878#overview" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5499" title="Double click to edit">Let's create testing old files:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">touch -d "Thu, 1 March 2018 12:30:00" a</span><br /><span style="color: green;">...</span><br /><br /><b>#</b> <span style="color: blue;">find ./ -mtime +90 -exec ls -l {} \;</span><br /><span style="color: green;">-rw-r--r-- 1 root root 0 Mar 1 2018 ./c<br />-rw-r--r-- 1 root root 0 Mar 1 2018 ./b<br />-rw-r--r-- 1 root root 0 Mar 1 2018 ./a</span></blockquote><br /><b>- <span style="color: olive;">03-1_delete_old_files.sh</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5355.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5355.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5355.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5355.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Author: John Lee </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Date: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Description: This script will delete files older than <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">90</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> days </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Modified: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># More: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Use below command to create old file <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> testing </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># touch -d <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Thu, 1 March 2018 12:30:00"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> a </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">TARGET_PATH=${TARGET_PATH:-`pwd`} </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> of in `find ${TARGET_PATH} -mtime +</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">90</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">` </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">do</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fname=$(basename $of) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> # mv $of <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"/tmp/${fname}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> <--- testing </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> rm $of <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"/tmp/${fname}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ $? -eq </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Deleted ${fname} done!"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Fail to delete ${fname}!"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fi </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">done </span></li></ol></div>Execution outpupt:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">./03-1_delete_old_files.sh</span><br /><span style="color: green;">Deleted c done!<br />Deleted b done!<br />Deleted a done!</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-84373701771919206392021-07-23T20:45:00.003-07:002021-07-23T20:45:30.081-07:00[ Python 常見問題 ] Using module 'subprocess' with timeout<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5498" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />Here's the Python code to run an arbitrary command returning its stdout data, or raise an exception on non-zero exit codes:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">proc = subprocess.Popen( </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> cmd, </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> stderr=subprocess.STDOUT, # Merge stdout and stderr </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> stdout=subprocess.PIPE, </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> shell=True) </span></li></ol></div><a class="snap_shots" href="https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">communicate</a> is used to wait for the process to exit:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">stdoutdata, stderrdata = proc.communicate() </span></li></ol></div>The <a class="snap_shots" href="https://docs.python.org/3/library/subprocess.html#module-subprocess" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>subprocess</b></a> <span style="color: darkred;"><b>module does not support timeout--ability to kill a process running for more than X number of seconds--therefore, communicate may take forever to run</b></span>.<br /><br />What is <b>the simplest way to implement timeouts in a Python program meant to run on Windows and Linux?</b><br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />In Python 3.3+:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from subprocess </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> STDOUT, check_output </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">output = check_output(cmd, stderr=STDOUT, timeout=seconds) </span></li></ol></div><i>output</i> is a byte string that contains command's merged stdout, stderr data.<br /><br /><a class="snap_shots" href="https://docs.python.org/3/library/subprocess.html#subprocess.check_output" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">check_output</a> raises <span style="color: blue;"><b>CalledProcessError</b></span> on non-zero exit status as specified in the question's text unlike <a class="snap_shots" href="https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">proc.communicate()</a> method.<br /><br />I've removed <span style="color: blue;">shell=True</span> because it is often used unnecessarily. You can always add it back if cmd indeed requires it. If you add <span style="color: blue;">shell=True</span> i.e., if the child process spawns its own descendants; <a class="snap_shots" href="https://docs.python.org/3/library/subprocess.html#subprocess.check_output" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">check_output()</a> can return much later than the timeout indicates, see <a class="snap_shots" href="https://stackoverflow.com/q/36952245/4279" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Subprocess timeout failure</u></a>.<br /><br />For a quick demonstration:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">from subprocess import STDOUT, check_output</span><br /><b>>>></b> <span style="color: blue;">check_output('sleep 1 && echo test', stderr=STDOUT, timeout=5, shell=True)</span><br /><span style="color: green;">b'test\n'</span><br /><b>>>></b> <span style="color: blue;">check_output('sleep 6 && echo test', stderr=STDOUT, timeout=5, shell=True)</span><br /><span style="color: green;">...<br />subprocess.TimeoutExpired: Command 'sleep 6 && echo test' timed out after 5 seconds</span></blockquote><br />Another approach is to use Python <a class="snap_shots" href="https://docs.python.org/3/library/threading.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>threading</b></a> module to wrap your command execution. e.g.:<br /><b>- <span style="color: olive;">test.py</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5354.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/usr/bin/env python3 </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> subprocess, threading </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">class</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> Command(object): </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def __init__(self, cmd): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.cmd = cmd </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.process = None </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def run(self, timeout): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def target(): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Thread started'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.process = subprocess.Popen(self.cmd, shell=True) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.process.communicate() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Thread finished'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> thread = threading.Thread(target=target) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> thread.start() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> thread.join(timeout) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> thread.is_alive(): </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Terminating process'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> self.process.terminate() </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> thread.join() </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"command:{self.cmd}\nWith rc={self.process.returncode} (timeout={timeout})"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">command = Command(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"echo 'Process started'; sleep 2; echo 'Process finished'"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">command.run(timeout=<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">3</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">command.run(timeout=<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div>Execution result:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">./test.py</span><br /><span style="color: green;">Thread started<br />Process started<br />Process finished<br />Thread finished<br />command:echo 'Process started'; sleep 2; echo 'Process finished'<br />With rc=0 (timeout=3)<br />Thread started<br />Process started<br />Terminating process<br />Thread finished<br />command:echo 'Process started'; sleep 2; echo 'Process finished'<br /><b>With rc=-15 (timeout=1)</b></span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-31941058484703527872021-07-23T20:25:00.002-07:002021-07-23T20:25:12.578-07:00[ Bash 範例代碼 ] Check remote server connectivity<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://www.udemy.com/course/linux-bash-shell-scripting-through-real-life-examples/learn/lecture/9992726#overview" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5497" title="Double click to edit"><b>- <span style="color: olive;">02-1_ping_server.sh</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Author: John Lee </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Date: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Description: This script will ping a remote host </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Modified: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">HOST=${HOST:-localhost} </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">ping -c1 ${HOST} &> /dev/<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">null</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ $? -eq </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]; then </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo $HOST ok </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo $HOST NOT ok! </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>Execution output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">export HOST=8.8.8.8 && ./02-1_ping_server.sh</span><br /><span style="color: green;">8.8.8.8 ok</span><br /><br /><b>#</b> <span style="color: blue;">export HOST=8.8.8.9 && ./02-1_ping_server.sh</span><br /><span style="color: green;">8.8.8.9 NOT ok!</span></blockquote><br /><b>- <span style="color: olive;">02-2_ping_servers.sh</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5353.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Author: John Lee </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Date: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Description: This script will ping multiple hosts given in </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># a file declared in variable `IP_LIST_FILE` </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Modified: <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">2021</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">07</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">/</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">24</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">function ping_host { </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ping -c1 $<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> &> /dev/</span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">null</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ $? -eq </span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]; then </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo $<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ok </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo $<span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> NOT ok! </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fi </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">} </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">IP_LIST_FILE=${IP_LIST_FILE:-<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"ip_list_file"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">} </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ -f ${IP_LIST_FILE} ]; then </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ip in $(cat $IP_LIST_FILE) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">do</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ping_host $ip </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> done </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"File $IP_LIST_FILE not exist!"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> exit <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>Execution output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">cat ip_list_file</span><br /><span style="color: green;">8.8.8.8<br />168.95.1.1</span><br /><br /><b>#</b> <span style="color: blue;">unset IP_LIST_FILE</span><br /><b>#</b> <span style="color: blue;">./02-2_ping_servers.sh</span><br /><span style="color: green;">8.8.8.8 ok<br />168.95.1.1 ok</span><br /><br /><b>#</b> <span style="color: blue;">export IP_LIST_FILE='not_exist' && ./02-2_ping_servers.sh</span><br /><span style="color: green;">File not_exist not exist!</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-2431947631942302812021-07-17T21:20:00.004-07:002021-07-17T21:20:31.939-07:00[Linux 文章收集] How to Compare Strings in Bash<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://linuxize.com/post/how-to-compare-strings-in-bash/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5493" title="Double click to edit"><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Preface</b></span></span><br />When writing Bash scripts you will often need to compare two strings to check if they are equal or not. Two strings are equal when they have the same length and contain the same sequence of characters.<br /><br /><b>This tutorial describes how to compare strings in Bash.</b><br /><br /><span style="font-size: 16px; line-height: normal;"><span style="color: darkblue;"><b>Comparison Operators</b></span></span><br />Comparison operators are operators that compare values and return true or false. When comparing strings in Bash you can use the following operators:<br /><b>* <span style="color: blue;">string1 = string2</span> and <span style="color: blue;">string1 == string2</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">The equality operator returns true if the operands are equal.<br />- Use the <b>=</b> operator with the <span style="color: blue;">test [</span> command.<br />- Use the <b>==</b> operator with the <span style="color: blue;">[[</span> command for pattern matching.</blockquote><br /><b>* <span style="color: blue;">string1 != string2</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">The inequality operator returns true if the operands are not equal.</blockquote><br /><b>* <span style="color: blue;">string1 =~ regex</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">The regex operator returns true if the left operand matches the extended regular expression on the right.</blockquote><br /><b>* <span style="color: blue;">string1 > string2</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">The greater than operator returns true if the left operand is greater than the right sorted by lexicographical (alphabetical) order.</blockquote><br /><b>* <span style="color: blue;">string1 < string2</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">The less than operator returns true if the right operand is greater than the right sorted by lexicographical (alphabetical) order.</blockquote><br /><b>* <span style="color: blue;">-z string</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">True if the string length is zero.</blockquote><br /><b>* <span style="color: blue;">-n string</span></b><br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;">True if the string length is non-zero.</blockquote><br />Following are a few points to be noted when comparing strings:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>*</b> A blank space must be used between the binary operator and the operands.<br /><b>*</b> Always use double quotes around the variable names to avoid any word splitting or globbing issues.<br /><b>*</b> Bash does not segregate variables by “type”, variables are treated as integer or string depending on the context</blockquote><br /><span style="font-size: 15px; line-height: normal;"><span style="color: green;"><b>Check if Two Strings are Equal</b></span></span><br /><b>In most cases, when comparing strings you would want to check whether the strings are equal or not.</b><br /><br />The following script uses the <i>if</i> statement and the <i>test [</i> command to check if the strings are equal or not with the <span style="color: orange;"><b>=</b></span> operator:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR1=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Linuxize"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR2=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Linuxize"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [ </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR1"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> = </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR2"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Strings are equal."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Strings are not equal."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>When the script is executed it will print the following output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">Strings are equal.</span></blockquote><br />Here is another script that takes the input from the user and compares the given strings. In this example, we will use the <i>[[</i> command and <span style="color: orange;"><b>==</b></span> operator.<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read -p <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Enter first string: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> VAR1 </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">read -p <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Enter second string: "</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> VAR2 </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [[ </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR1"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> == </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR2"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Strings are equal."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Strings are not equal."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>Run the script and enter the strings when prompted:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">Enter first string:</span> <span style="color: blue;">Linuxize</span><br /><span style="color: green;">Enter second string:</span> <span style="color: blue;">Ubuntu</span><br /><span style="color: green;">Strings are not equal.</span></blockquote><br />You can also use the logical and <span style="color: orange;"><b>&&</b> </span>and or <span style="color: orange;"><b>||</b></span> to compare strings:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">[[ </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"string1"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> == </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"string2"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]] && echo </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Equal"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> || echo </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Not equal"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li></ol></div>Output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">Not equal</span></blockquote><br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: green;"><b>Check if a String Contains a Substring</b></span></span><br /><b>There are multiple ways to check if a string contains a substring.</b><br /><br />One approach is to use surround the substring with asterisk symbols <b>*</b> which means match all characters.<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'GNU/Linux is an operating system'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [[ $VAR == *</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Linux"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">* ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"It's there."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>The script will <a class="snap_shots" href="https://linuxize.com/post/echo-command-in-linux-with-examples/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">echo</a> the following:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">It's there.</span></blockquote><br />Another option is to use the regex operator <span style="color: orange;"><b>=~</b></span> as shown below:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'GNU/Linux is an operating system'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [[ $VAR =~ .*Linux.* ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"It's there."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>The period followed by an asterisk <b>.*</b> matches zero or more occurrences any character except a newline character.<br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: green;"><b>Check if a String is Empty</b></span></span><br /><b>Quite often you will also need to check whether a variable is an empty string or not. You can do this by using the <span style="color: violet;">-n</span> and <span style="color: violet;">-z</span> operators.</b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [[ -z $VAR ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"String is empty."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>Output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">String is empty.</span></blockquote><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Linuxize'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [[ -n $VAR ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"String is not empty."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>Output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">String is not empty.</span></blockquote><br /><span style="color: green;"><span style="font-size: 15px; line-height: normal;"><b>Comparing Strings with the Case Operator</b></span></span><br />Instead of using the test operators you can also use the <a class="snap_shots" href="https://linuxize.com/post/bash-case-statement/" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>case statement</b></a> to compare strings:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Arch Linux"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">case</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> $VAR in </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Arch Linux"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo -n <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Linuxize matched"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ;; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Fedora | CentOS) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo -n <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Red Hat"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> ;; </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">esac </span></li></ol></div>Output:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">Linuxize matched.</span></blockquote><br /><span style="font-size: 15px; line-height: normal;"><span style="color: green;"><b>Lexicographic Comparison</b></span></span><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5349.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/bin/bash </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR1=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Linuxize"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">VAR2=<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Ubuntu"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> [[ </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR1"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> > </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR2"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"${VAR1} is lexicographically greater then ${VAR2}."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">elif [[ <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR1"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> < </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"$VAR2"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> ]]; then </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"${VAR2} is lexicographically greater than ${VAR1}."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> echo <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Strings are equal"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">fi </span></li></ol></div>The script will output the following:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><span style="color: green;">Ubuntu is lexicographically greater than Linuxize.</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-35607274493201824282021-07-03T02:26:00.002-07:002021-07-03T02:26:52.119-07:00[ Python 自製工具 ] count_fc.py: Count modul/function calls<p> <b style="color: darkblue; font-family: verdana, arial, helvetica, sans-serif; font-size: 15px;">Preface</b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5492" title="Double click to edit">在某個工作下, 剛好需要統計在某個複雜程式執行中, 到底執行了多少模組底下的函數. 因此就開發了這個工具:<br /><b>- <span style="color: olive;">count_fc.py</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> os </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> atexit </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> inspect </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> json </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> threading </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> logging </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> coloredlogs </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">from collections <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> defaultdict </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">################################ </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Constants </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">################################ </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">MODU_PATH = os.path.dirname(__file__) <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> os.path.dirname(__file__) </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">else</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'./'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' Path of current module '</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">LOGGER_FORMAT = <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"[%(levelno)s|%(module)s|%(lineno)s] %(message)s"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' Format of Logger '</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">LOGGER_LEVEL = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">10</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> # CRITICAL=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">50</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; ERROR=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">40</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; WARNING=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">30</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; INFO=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">20</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">; DEBUG=</span><span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">10</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' Message level of Logger '</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">################################ </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># Local variables </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">################################ </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">_glock = threading.Lock() </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' Global threading lock '</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">_unloaded_modu_set = set() </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' Used to keep already unloaded module to avoid duplicate unload '</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">_log = logging.getLogger(__name__) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">' Logger object '</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">''</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">_log.setLevel(LOGGER_LEVEL) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">_log.propagate = False </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">coloredlogs.install(level=LOGGER_LEVEL, logger=_log, fmt=LOGGER_FORMAT) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def func_count(f): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">""</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">"Function decorator to accumulate the times of execution. </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Args: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> f: callable, function to count execution. </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Returns: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> The wrapped function. </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">""</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">" </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def wrapped(*args, **kwargs): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.calls += <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.name = f.__name__ </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.modu_name = f.__module__ </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.is_wrapped = True </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> f(*args, **kwargs) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.calls = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> wrapped </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def unload(modu): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">""</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">"The function to be called when a module is unloaded </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Args: </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> modu: The module which is about to be unloaded. </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">""</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">" </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> with _glock: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> modu in _unloaded_modu_set: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> _log.debug(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Unload {modu}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> stat_pkfile_path = f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'/tmp/{modu.__name__}.json'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> flist = [a <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> a in dir(modu)] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fdict = defaultdict(<span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">int</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> a in flist: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fo = getattr(modu, a) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> hasattr(fo, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'is_wrapped'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) and fo.modu_name == modu.__name__: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> _log.debug(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"\tCount {fo.name}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fdict[fo.name] += <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> fdict: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> with open(stat_pkfile_path, <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'w'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) as fw: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> json.dump(fdict, fw) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> _unloaded_modu_set.add(modu) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def decorate_mod(modu): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">""</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">"Decorate all the function(s) of input module </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> Args: </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> modu: This function will decorate all the function(s) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> collected from <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">this</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> module with `func_count` and register </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">this</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> module with a method which will be called when unload. </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">""</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">" </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> _log.debug(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Decorate {modu}'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> flist = [a <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> a in dir(modu)] </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> a in flist: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> fo = getattr(modu, a) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> inspect.isfunction(fo) and fo.__module__ == modu.__name__: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> _log.debug(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"\tfo={fo}; {fo.__module__}, {modu.__name__}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> setattr(modu, fo.__name__, func_count(fo)) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> setattr(modu, <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'unload'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, unload) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> atexit.register(modu.unload, modu) </span></li></ol></div><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Usage:</b></span></span><br />這邊以模組 <span style="color: olive;">xyz.py</span> 與<span style="color: olive;"> haha.py </span>為例:<br /><b>- <span style="color: olive;">haha.py</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">from count_fc </span><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> decorate_mod </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">from xyz <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> * </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def say_hi(name): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(message(name)) </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">decorate_mod(sys.modules[__name__]) </span></li></ol></div><b>- <span style="color: olive;">xyz.py</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> sys </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> random </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">from count_fc <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> decorate_mod </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def message(name): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> random.choice(greeting_metods)(name) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def greeting_with_aloha(name): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> f</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Aloha, {name}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def greeting_with_hello(name): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> f</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Hello, {name}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def greeting_with_hi(name): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> f</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Hi, {name}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">decorate_mod(sys.modules[__name__]) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">greeting_metods = [ </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> greeting_with_aloha, </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> greeting_with_hello, </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> greeting_with_hi </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">] </span></li></ol></div>接著是主程式:<br /><b>- <span style="color: olive;">main.py</span></b><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5348.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">#!/usr/bin/env python </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">from haha <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> say_hi </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">if</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> __name__ == </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'__main__'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">for</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> name in [</span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'John'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Mary'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Key'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Peter'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Jane'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'Bob'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">]: </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> say_hi(name) </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(say_hi.calls) </span></li></ol></div>執行結果如下:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">./main.py</span><br /><span style="color: green;">[10|count_fc|92] Decorate <module 'xyz' from '/root/abc/xyz.py'><br />[10|count_fc|97] fo=<function greeting_with_aloha at 0x7f2c6ceacd30>; xyz, xyz<br />[10|count_fc|97] fo=<function greeting_with_hello at 0x7f2c6ceacdc0>; xyz, xyz<br />[10|count_fc|97] fo=<function greeting_with_hi at 0x7f2c6ceace50>; xyz, xyz<br />[10|count_fc|97] fo=<function message at 0x7f2c6ceacca0>; xyz, xyz<br />[10|count_fc|92] Decorate <module 'haha' from '/root/abc/haha.py'><br />[10|count_fc|97] fo=<function say_hi at 0x7f2c6cff7ee0>; haha, haha<br />Hello, John<br />Aloha, Mary<br />Aloha, Key<br />Hi, Peter<br />Aloha, Jane<br />Aloha, Bob<br />6<br />[10|count_fc|67] Unload <module 'haha' from '/root/abc/haha.py'><br />[10|count_fc|74] Count say_hi<br />[10|count_fc|67] Unload <module 'xyz' from '/root/abc/xyz.py'><br />[10|count_fc|74] Count greeting_with_aloha<br />[10|count_fc|74] Count greeting_with_hello<br />[10|count_fc|74] Count greeting_with_hi<br />[10|count_fc|74] Count message</span></blockquote><br />接著可以去 <span style="color: olive;">/tmp/</span> 目錄撿收產生的每個模組的呼叫結果:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>#</b> <span style="color: blue;">ls -hl /tmp/*.json</span><br /><span style="color: green;">-rw-r--r-- 1 root root 13 Jul 3 02:10 /tmp/haha.json<br />-rw-r--r-- 1 root root 36 Jul 3 02:10 /tmp/xyz.json</span><br /><br /><b>#</b> <span style="color: blue;">cat /tmp/haha.json</span><br /><span style="color: green;">{"say_hi": 1}</span><br /><br /><b>#</b> <span style="color: blue;">cat /tmp/xyz.json</span><br /><span style="color: green;">{"greeting_with_aloha": 4, "greeting_with_hello": 1, "greeting_with_hi": 1, "message": 6}</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-82487463112504342312021-07-03T01:35:00.004-07:002021-07-03T01:35:34.974-07:00[ Python 常見問題 ] Detect when a Python module unloads<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/570636/detect-when-a-python-module-unloads" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5491" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />I have a module that uses ctypes to wrap some functionality from a static library into a class. When the module loads, it calls an initialize function in the static library. When the module is unloaded (<span style="color: brown;">presumably when the interpreter exits</span>), there's an unload function in the library that I'd like to be called. How can I create this hook?<br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />Use the <a class="snap_shots" href="http://docs.python.org/library/atexit.html" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><b>atexit</b></a> module:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> mymodule </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> atexit </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"># call mymodule.unload(<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'param1'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'param2'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) when the interpreter exits: </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">atexit.register(mymodule.unload, <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'param1'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">, </span><span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">'param2'</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div>Another simple example from the docs, using <a class="snap_shots" href="https://docs.python.org/3/library/atexit.html#atexit.register" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new">register</a> as a decorator:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5347.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">import</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> atexit </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@atexit</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">.register </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def goodbye(): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print <span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"You are now leaving the Python sector."</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li></ol></div></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0tag:blogger.com,1999:blog-6093881388384310682.post-66285495013105170702021-07-03T01:29:00.004-07:002021-07-03T01:29:33.976-07:00[ Python 常見問題 ] Python dynamically add decorator to class' methods by decorating class<p> <b style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Source From <a class="snap_shots" href="https://stackoverflow.com/questions/5481623/python-dynamically-add-decorator-to-class-methods-by-decorating-class" rel="nofollow" style="color: #01336b; text-decoration-line: none;" target="_new"><u>Here</u></a></b></p><span class="postbody" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; line-height: 1.5em;"><div class="edit_area" id="5489" title="Double click to edit"><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>Question</b></span></span><br />Let's say I have a decorator which will be used to count the times of a function is executed:<br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def counted(f): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> def wrapped(*args, **kwargs): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.calls += <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">1</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> f(*args, **kwargs) </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> wrapped.calls = <span class="number" style="background-color: inherit; border: none; color: #c00000; margin: 0px; padding: 0px;">0</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> <span class="keyword" style="background-color: inherit; border: none; color: #006699; font-weight: bold; margin: 0px; padding: 0px;">return</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> wrapped </span></span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"><span class="annotation" style="background-color: inherit; border: none; color: #646464; margin: 0px; padding: 0px;">@counted</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;"> </span></span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def say_hi(name): </span></li><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Hi, {name}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div>For example:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">from test import *</span><br /><b>>>></b> <span style="color: blue;">say_hi('John')</span><br /><span style="color: green;">Hi, John</span><br /><b>>>></b> <span style="color: blue;">say_hi('Ken')</span><br /><span style="color: green;">Hi, Ken</span><br /><b>>>> </b><span style="color: blue;">say_hi.calls</span><br /><span style="color: green;">2</span><br /><b>>>></b> <span style="color: blue;">say_hi.__name__</span><br /><span style="color: green;">'wrapped'</span></blockquote><br />Then I have new function <span style="color: blue;">say_hello</span><br /><div class="dp-highlighter" style="background-color: #e7e5dc; font-family: Consolas, "Courier New", Courier, mono, serif; margin: 18px 0px !important; overflow: auto; padding-top: 1px; width: 1157.31px;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="background-color: #f8f8f8; border-left: 3px solid rgb(108, 226, 108); color: silver; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; padding: 3px 8px 10px 10px;"><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">view plain</a><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">copy to clipboard</a><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">print</a><a href="http://localhost/jforum/posts/list/5345.page#" style="background-attachment: initial; background-clip: initial; background-color: inherit; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #a0a0a0; margin: 0px 10px 0px 0px; padding: 0px; text-decoration-line: none;">?</a></div></div><ol class="dp-j" start="1" style="background-color: white; border: none; color: #5c5c5c; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1px 45px !important; padding: 0px;"><li class="alt" style="border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; color: inherit; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;">def say_hello(name): </span></li><li class="" style="background-color: #f8f8f8; border-bottom: none; border-image: initial; border-left: 3px solid rgb(108, 226, 108); border-right: none; border-top: none; line-height: 14px; list-style-image: initial; list-style-position: outside !important; list-style-type: decimal-leading-zero; margin: 0px !important; padding: 0px 3px 0px 10px !important;"><span style="background-color: inherit; border: none; color: black; margin: 0px; padding: 0px;"> print(f<span class="string" style="background-color: inherit; border: none; color: blue; margin: 0px; padding: 0px;">"Hello, {name}"</span><span style="background-color: inherit; border: none; margin: 0px; padding: 0px;">) </span></span></li></ol></div>How can I dynamically add decorator on it so to count the times of execution of it?<br /><br /><span style="font-size: 15px; line-height: normal;"><span style="color: darkblue;"><b>HowTo</b></span></span><br />It is a bit complicated. Let's say your module is <span style="color: olive;">test.py</span>. Then you can do it this way:<br /><blockquote class="uncited" style="background: url("../images/quote.gif") 6px 8px no-repeat scroll rgb(225, 235, 242); border: 1px dashed rgb(219, 219, 206); font-size: 0.95em; margin: 0.5em 10px 0pt; overflow: hidden; padding: 25px 5px 5px;"><b>>>></b> <span style="color: blue;">import test</span><br /><b>>>></b> <span style="color: blue;">import inspect</span><br /><b>>>></b> <span style="color: blue;">test_func_list = [a for a in dir(test) if inspect.isfunction(getattr(test, a))]</span><br /><b>>>></b> <span style="color: blue;">test_func_list </span><span style="color: brown;"># All the functions in module test</span><br /><span style="color: green;">['counted', 'say_hello', 'say_hi']</span><br /><br /><b>>>></b> <span style="color: blue;">setattr(test, 'say_hello', test.counted(test.say_hello))</span> <span style="color: brown;"># Add decorator @counted in test.say_hello</span><br /><b>>>></b> <span style="color: blue;">test.say_hello('Ken')</span><br /><span style="color: green;">Hello, Ken</span><br /><b>>>></b> <span style="color: blue;">test.say_hello('Jane')</span><br /><span style="color: green;">Hello, Jane</span><br /><b>>>></b> <span style="color: blue;">test.say_hello.calls</span> <span style="color: brown;"># How many times that test.say_hello being called</span><br /><span style="color: green;">2</span><br /><b>>>></b> <span style="color: blue;">test.say_hello.__name__</span><br /><span style="color: green;">'wrapped'</span></blockquote></div></span><span style="background-color: #fafafa; font-family: verdana, arial, helvetica, sans-serif;"></span><p style="font-family: verdana, arial, helvetica, sans-serif;"><br /></p>Johnhttp://www.blogger.com/profile/04682088884492411130noreply@blogger.com0