[Python-Dev] Argument Clinic: what to do with builtins with non-standard signatures?

Serhiy Storchaka storchaka at gmail.com
Fri Jan 24 17:32:23 CET 2014


24.01.14 18:28, Serhiy Storchaka написав(ла):
> 24.01.14 17:07, Larry Hastings написав(ла):
>> a) Functions where there's a static Python value that behaves
>>     identically to not passing in that parameter (aka "the NULL problem")
> [...]
>>     Possible Solutions:
>>       0) Do nothing, don't convert the function.
>>       1) Use that clever static value as the default.
>
> I think #1 is reasonable solution. Internals of C function are just
> implementation details.
>
>
>> b) Functions where there's no static Python value that behaves
>> identically to
>>     not passing in that parameter (aka "the dynamic default problem")
>>
>>     There are functions with parameters whose defaults are mildly
>> dynamic,
>>     responding to other parameters.
>>
>>     Example:
>>       I forget its name, but someone recently showed me a builtin that
>> took
>>       a list as its first parameter, and its optional second parameter
>>       defaulted to the length of the list.  As I recall this function
>> didn't
>>       allow negative numbers, so -1 wasn't a good fit.
>>
>>     Possible solutions:
>>       0) Do nothing, don't convert the function.
>>       1) Use a magic value as None.  Preferably of the same type as the
>>          function accepts, but failing that use None.  If they pass in
>>          the magic value use the previous default value.  Guido himself
>>          suggested this in
>>       2) Use an Argument Clinic "optional group".  This only works for
>>          functions that don't support keyword arguments.  Also, I hate
>>          this, because "optional groups" are not expressable in Python
>>          syntax, so these functions automatically have invalid
>> signatures.
>
> This is list.index(self, item, start=0, stop=len(self). Vajrasky Kok
> works on this in issue20185 [1].
>
> In this particular case we can use default stop=sys.maxsize, as in many
> other places.
>
>
>> c) Functions that accept an 'int' when they mean 'boolean' (aka the
>>     "ints instead of bools" problem)
> [...]
>>     I assert that Python has a crystal clear definition of what
>>     constitutes "true" and "false".  These parameters are clearly
>>     intended as booleans but they don't conform to the boolean
>>     protocol.  So I suggest every instance of this is a (very mild!)
>>     bug.  But changing these parameters to use "p" is a change: they'll
>>     accept many more values than before.
>
> See issue15999 [2] which 16 months waits for review.
>
>>     Solution:
>>       1) Use "bool".
>>       2) Use "int", and I'll go relax Argument Clinic so they
>>          can use bool values as defaults for int parameters.
>
> I use
>
>      int(c_default="0") = False
>      int(c_default="1") = True
>
> See also rejected issue20282 [3].
>
>
>> d) Functions with behavior that deliberately defy being expressed as a
>>     Python signature (aka the "untranslatable signature" problem)
>>
>>     Example:
>>       itertools.repeat(), which behaves differently depending on whether
>>       "times" is supplied as a positional or keyword argument.  (If
>>       "times" is <0, and was supplied via position, the function yields
>>       0 times. If "times" is <0, and was supplied via keyword, the
>>       function yields infinitely-many times.)
>>
>>     Solution:
>>       0) Do nothing, don't convert the function.
>>       1) Change the signature until it is Python compatible.  This new
>>          signature *must* accept a superset of the arguments accepted
>>          by the existing signature.  (This is being discussed right
>>          now in issue #19145.)
>
> In this particular case this is a bug and should be fixed irrespective
> of Argument Clinic.
>
> If we implemented this function in pure Python, we would have used the
> sentinel idiom.
>
> _forever = object()
>
> def repeat(value, times=_forever):
>      if times is _forever:
>          ...
>      else:
>          ...
>
> We need an equivalent to the sentinel idiom in Argument Clinic.
>
>
> There is fifth category. The default value is C constant which is not
> exposed to Python. For example in the zlib module:
>
> zlib.decompress(data, [wbits, [bufsize]])

Oh, I have deleted links.

[1] http://bugs.python.org/issue20185
[2] http://bugs.python.org/issue15999
[3] http://bugs.python.org/issue20282




More information about the Python-Dev mailing list