<div dir="ltr"><div>[Cameron Simpson]</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I've been writing quite a few functions lately where it is reasonable for a <br>caller to want to pass arbitrary keyword arguments, but where I also want some <br>additional parameters for control purposes.</blockquote><div><br>I've run into this before and use the trailing '_' convention for names:<br><br><font face="monospace, monospace">def update(self, where_, **column_vals): ... </font></div><div><br>Because such names are **probably** never going to show up. But, of course; if such<br>a name were actually used for a column, it would be a fantastically hard bug to find!<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Sep 6, 2018 at 11:01 PM Cameron Simpson <<a href="mailto:cs@cskk.id.au">cs@cskk.id.au</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 01Mar2017 21:25, Serhiy Storchaka <<a href="mailto:storchaka@gmail.com" target="_blank">storchaka@gmail.com</a>> wrote:<br>
>On 28.02.17 23:17, Victor Stinner wrote:<br>
>>My question is: would it make sense to implement this feature in<br>
>>Python directly? If yes, what should be the syntax? Use "/" marker?<br>
>>Use the @positional() decorator?<br>
><br>
>I'm strongly +1 for supporting positional-only parameters. The main <br>
>benefit to me is that this allows to declare functions that takes <br>
>arbitrary keyword arguments like Formatter.format() or <br>
>MutableMapping.update(). Now we can't use even the "self" parameter <br>
>and need to use a trick with parsing *args manually. This harms clearness and <br>
>performance.<br>
<br>
I was a mild +0.1 on this until I saw this argument; now I am +1 (unless <br>
there's some horrible unforseen performance penalty).<br>
<br>
I've been writing quite a few functions lately where it is reasonable for a <br>
caller to want to pass arbitrary keyword arguments, but where I also want some <br>
additional parameters for control purposes. The most recent example was <br>
database related: functions accepting arbitrary keyword arguments indicating <br>
column values.<br>
<br>
As a specific example, what I _want_ to write includes this method:<br>
<br>
  def update(self, where, **column_values):<br>
<br>
Now, because "where" happens to be an SQL keyword it is unlikely that there <br>
will be a column of that name, _if_ the database is human designed by an SQL <br>
person. I have other examples where picking a "safe" name is harder. I can even <br>
describe scenarios where "where" is plausible: supposing the the database is <br>
generated from some input data, perhaps supplied by a CSV file (worse, a CSV <br>
file that is an export of a human written spreadsheet with a "Where" column <br>
header).  That isn't really even made up: I've got functions whose purpose is <br>
to import such spreadsheet exports, making namedtuple subclasses automatically <br>
from the column headers.<br>
<br>
In many of these situations I've had recently positional-only arguments would <br>
have been very helpful. I even had to bugfix a function recently where a <br>
positional argument was being trouced by a keyword argument by a caller.<br>
<br>
Cheers,<br>
Cameron Simpson <<a href="mailto:cs@cskk.id.au" target="_blank">cs@cskk.id.au</a>><br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div>