<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div dir="ltr"></div><div dir="ltr"><br></div><div dir="ltr"><br>On 24 Dec 2018, at 11:21, 李默 <<a href="mailto:phylimo@163.com">phylimo@163.com</a>> wrote:<br><br></div><blockquote type="cite"><div dir="ltr">

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


<style>
    font{
        line-height: 1.6;
    }
    ul,ol{
        padding-left: 20px;
        list-style-position: inside;
    }
</style>
<div style="font-family:Helvetica,Helvetica,微软雅黑, 宋体; line-height:1.6;">
    <div></div>
<style>
    font{
        line-height: 1.6;
    }
    ul,ol{
        padding-left: 20px;
        list-style-position: inside;
    }
</style>
<div style="font-family:Helvetica,Helvetica,微软雅黑, 宋体; line-height:1.6;">
    <div></div><div style="line-height: 1.7;"><div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Consolas">I am having an idea on loosing the argument validity check when passing the function arguments in keyword way. </font></div><div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Consolas">For example:</font></div><div style="color: rgb(0, 0, 0); font-size: 14px;"><span class="pl-k" style="white-space: pre-wrap;"><font face="Consolas">-------------------------------</font></span></div><div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Consolas"><span class="pl-k" style="white-space: pre-wrap;">def</span><span style="white-space: pre-wrap;"> </span><span class="pl-en" style="white-space: pre-wrap;">f</span><span style="white-space: pre-wrap;">(</span><span class="pl-smi" style="white-space: pre-wrap;">x</span><span style="white-space: pre-wrap;">, </span><span class="pl-smi" style="white-space: pre-wrap;">y</span><span style="white-space: pre-wrap;">):</span></font></div><div><pre style="color: rgb(0, 0, 0); font-size: 14px; width: 1610.25px;"><font face="Consolas">    <span class="pl-c1">print</span>(x, y)
<span class="pl-k">def</span> <span class="pl-en">call_f</span>():
    f(<span class="pl-v">x</span><span class="pl-k">=</span><span class="pl-c1">7</span>, <span class="pl-v">y</span><span class="pl-k">=</span><span class="pl-c1">9</span>, <span class="pl-v">z</span><span class="pl-k">=</span><span class="pl-c1">9</span>)
<br></font></pre><pre style="color: rgb(0, 0, 0); font-size: 14px; width: 1610.25px;"><font face="Consolas">call_f()</font></pre><pre style="color: rgb(0, 0, 0); font-size: 14px; width: 1610.25px;"><font face="Consolas">------------------------------</font></pre><pre style="color: rgb(0, 0, 0); font-size: 14px; width: 1610.25px;"><font face="Consolas">In the current of python, the extra pass of 'z' would let the interpreter raise an exception and stop work.  My idea is that the interpreter need not stop because all the needed args are completely provided.  Of course for this toy example, 'f' can be define as  f(x, y, **kwargs) to achieve the same goal.  However,  essentially it is reasonably to keep interpreter going as long as enough args are passed.  And this modification can bring more freedom of programming. </font></pre></div></div></div></div></div></blockquote><br><div>Similar features exists in JavaScript (where you can also do the same thing with positional arguments), and Clojure to make two. </div><div><br></div><div>I personally think this is extremely bad. This type of behavior can make error in your code slip by undetected for a very long time. Let's take a concrete example! We have a function:</div><div><br></div><div>def foo(*, a, b=3, c):</div><div>    ....</div><div><br></div><div>People call it like so:</div><div><br></div><div>foo(a=7, b=1, c=11)</div><div><br></div><div>Now what happens if we rename argument b to q? The above code still runs! It just now passes 3 (the default value) to foo instead of the intended 1. </div><div><br></div><div>I hope this example is enough to convince you of the danger of such a feature. It's certainly the reason why I think JavaScript and Clojure are terrible when it comes to passing arguments :)</div><div><br></div><div>Best regards</div><div>Anders</div></body></html>