[Python-Dev] A Desperate Plea For Introspection (aka: BDFAP Needed)

Guido van Rossum guido at python.org
Fri Jun 22 21:26:48 CEST 2012


On Fri, Jun 22, 2012 at 12:24 PM, Yury Selivanov
<yselivanov.ml at gmail.com> wrote:
> On 2012-06-22, at 3:18 PM, Guido van Rossum wrote:
>
>> On Fri, Jun 22, 2012 at 12:10 PM, Yury Selivanov
>> <yselivanov.ml at gmail.com> wrote:
>>> Guido,
>>>
>>> On 2012-06-22, at 2:52 PM, Guido van Rossum wrote:
> ...
>>> 'empty' will also work.  When python-dev collectively decided to
>>> go with missing attributes, 'empty' didn't yet exist (we added
>>> it with 'replace()' methods).
>>>
>>> If you think that using 'empty' is better, we can add that to the PEP.
>>
>> Yes, please do.
>
> OK
>
>>>> (2) Could use an example on how to remove and add parameters using replace().
>>>
>>> You have to build a new list of parameters and then pass it to 'replace()'.
>>> Example (from the actual signature() function implementation):
>>>
>>>    if isinstance(obj, types.MethodType):
>>>        # In this case we skip the first parameter of the underlying
>>>        # function (usually `self` or `cls`).
>>>        sig = signature(obj.__func__)
>>>        return sig.replace(parameters=tuple(sig.parameters.values())[1:])
>>>
>>>> (3) You are using name(arg1, *, arg2) a lot. I think in most cases you
>>>> mean for arg2 to be an optional keyword arg, but this notation doesn't
>>>> convey that it is optional. Can you clarify?
>>>
>>> Yes, I meant optional.  Would 'name(arg1, *, [arg2])' be better?
>>
>> Hardly, because that's not valid syntax. I'd write name(arg1, *,
>> arg2=<default>).
>
> Like
>
>    replace(*, name=<default>, kind=<default>, default=<default>,
>                                  annotation=<default>) -> Parameter
>
> or
>
>    replace(*, name=<optional>, kind=<optional>, default=<optional>,
>                                  annotation=<optional>) -> Parameter

Either one's an improvement, but you'll have to explain at the top of
the PEP what you intend this notation to mean. I'd go with <optional>
since the key thing here seems to be that various keywords, when not
specified, mean that nothing changes. OTOH in some places you can
probably write "foo=Signature.empty" (etc.).

>>>> (4) "If the object is a method" -- shouldn't that be "bound method"?
>>>> (Unbound methods are undetectable.) Or is there some wider definition
>>>> of method? What does it do for static or class methods?
>>>
>>> Yes, it should be "If the object is a bound method".  We'll fix this
>>> shortly.
>>
>> Great.
>>
>>> classmethod as a descriptor returns a BoundMethod (bound to the class),
>>> staticmethod returns the original unmodified function, so both of
>>> them are supported automatically.
>>
>> Oh, great. IIRC it wasn't always like that. Maybe just add this to the
>> PEP as a note?
>
> OK.  I'll clarify that.
>
> -
> Yury



-- 
--Guido van Rossum (python.org/~guido)


More information about the Python-Dev mailing list