<div dir="ltr">Hi,<div>Unfortunately in py2.7 it looks like I can't assign to callme.__call__.__signature__</div><div><div><br></div><div>AttributeError: 'instancemethod' object has no attribute '__signature__'</div></div><div><br></div><div>I was surprised that providing __signature__ for the class doesn't work, since what little documentation I could find for doing this (i.e. PEP362 and the python 3 inspect.signature documentation) all refers to "a callable object" and PEP362 lists "If the [callable] object has a __signature__ attribute and if it is not None - return it".</div><div><br></div><div>Anyway, it looks like I may need to use another trick for python2. I appreciate any ideas.</div><div><br></div><div>Thank you again,</div><div>Glenn</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 2, 2017 at 10:50 PM, Matthias Bussonnier <span dir="ltr"><<a href="mailto:bussonniermatthias@gmail.com" target="_blank">bussonniermatthias@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Glenn,<br>
<br>
Almost there, you need to set signature on __call__ not on the class.<br>
<br>
In [3]: import inspect<br>
   ...: class callme(object):<br>
<span class="">   ...:     def __call__(self,**kwargs):<br>
   ...:         return kwargs<br>
   ...:<br>
</span>   ...:<br>
   ...: callme.__call__.__signature__ = inspect.Signature(parameters={<br>
   ...:     inspect.Parameter('self',<wbr>inspect.Parameter.POSITIONAL_<wbr>OR_KEYWORD):1,<br>
   ...:     inspect.Parameter('long_arg',<wbr>inspect.Parameter.POSITIONAL_<wbr>OR_KEYWORD):2<br>
   ...:                                                            })<br>
   ...:<br>
<br>
In [4]: c = callme()<br>
<br>
In [5]: c?<br>
Signature:   c(long_arg)<br>
Type:        callme<br>
String form: <__main__.callme object at 0x11020fb00><br>
Docstring:   <no docstring><br>
<br>
This seem to work for me on tab completion.<br>
<span class="HOEnZb"><font color="#888888">--<br>
M<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Thu, Mar 2, 2017 at 7:20 PM, G Jones <<a href="mailto:glenn.caltech@gmail.com">glenn.caltech@gmail.com</a>> wrote:<br>
> Hi Matthias,<br>
> This seems to be exactly what I'm looking for, and it works fine when I<br>
> attach a __signature__ attribute to a simple function. I had to install<br>
> funcsigs because the project I'm working on is stuck with py2.7.<br>
> However, I am having trouble making it work for a callable class:<br>
><br>
> In [53]: class callme(object):<br>
>     ...:     def __call__(self,**kwargs):<br>
>     ...:         return kwargs<br>
>     ...:     __signature__ =<br>
> funcsigs.Signature(parameters=<wbr>[funcsigs.Parameter('long_arg'<wbr>,funcsigs.Parameter.<wbr>POSITIONAL_OR_KEYWORD)])<br>
><br>
> In [54]: c = callme()<br>
><br>
> In [55]: c?<br>
> Type:           callme<br>
> String form:    <__main__.callme object at 0x7f63e7124350><br>
> Signature:      c(long_arg)<br>
> Docstring:      <no docstring><br>
> Call signature: c(**kwargs)<br>
><br>
> So far so good, the signature is seen as expected. However, when I try to<br>
> tab complete with "c(long<tab>", long_arg is not in the list of suggestions.<br>
><br>
> Is there a way to accomplish this for a callable class?<br>
><br>
> Thanks,<br>
> Glenn<br>
><br>
> On Thu, Mar 2, 2017 at 4:25 PM, Matthias Bussonnier<br>
> <<a href="mailto:bussonniermatthias@gmail.com">bussonniermatthias@gmail.com</a>> wrote:<br>
>><br>
>> Hi Glenn,<br>
>><br>
>> You can set the `__signature__` of your object. likely possible with a<br>
>> decorator.<br>
>> Here is a short example of how you could do it in a REPL.<br>
>><br>
>><br>
>> In [21]: from inspect import Signature, Parameter<br>
>><br>
>> In [22]: def foo(*kwargs):<br>
>>     ...:     pass<br>
>><br>
>> In [23]: foo?<br>
>> Signature: foo(*kwargs)<br>
>> Docstring: <no docstring><br>
>> File:      ~/dev/docathon/<ipython-input-<wbr>22-086da1400d07><br>
>> Type:      function<br>
>><br>
>> In [24]: foo.__signature__ = Signature(parameters={<wbr>Parameter('a',<br>
>> Parameter.POSITIONAL_OR_<wbr>KEYWORD):None})<br>
>><br>
>> In [25]: foo?<br>
>> Signature: foo(a)<br>
>> Docstring: <no docstring><br>
>> File:      ~/dev/docathon/<ipython-input-<wbr>22-086da1400d07><br>
>> Type:      function<br>
>><br>
>><br>
>> That should  not only work with IPython, but with anything that use<br>
>> the Python inspect library.<br>
>><br>
>> Note that what I do above is imperfect as you should use an<br>
>> OrderedDict instead of a dict for `parameters=...`<br>
>><br>
>> Does that helps ?<br>
>><br>
>> --<br>
>> M<br>
>><br>
>><br>
>> On Thu, Mar 2, 2017 at 12:58 PM, G Jones <<a href="mailto:glenn.caltech@gmail.com">glenn.caltech@gmail.com</a>> wrote:<br>
>> > Hi,<br>
>> > Is it possible to customize the completion list when typing keyword<br>
>> > arguments?<br>
>> > For example suppose I have a function like:<br>
>> > def myfunc(**kwargs):<br>
>> >     val = kwargs['val']<br>
>> ><br>
>> > is there a way to tell ipython that when it sees me type:<br>
>> > myfunc(va<tab><br>
>> ><br>
>> > it suggests "val="?<br>
>> ><br>
>> > Thanks,<br>
>> > Glenn<br>
>> ><br>
>> ><br>
>> ><br>
>> > ______________________________<wbr>_________________<br>
>> > IPython-dev mailing list<br>
>> > <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
>> > <a href="https://mail.scipy.org/mailman/listinfo/ipython-dev" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/ipython-dev</a><br>
>> ><br>
>> ______________________________<wbr>_________________<br>
>> IPython-dev mailing list<br>
>> <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
>> <a href="https://mail.scipy.org/mailman/listinfo/ipython-dev" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/ipython-dev</a><br>
><br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> IPython-dev mailing list<br>
> <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
> <a href="https://mail.scipy.org/mailman/listinfo/ipython-dev" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/ipython-dev</a><br>
><br>
______________________________<wbr>_________________<br>
IPython-dev mailing list<br>
<a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
<a href="https://mail.scipy.org/mailman/listinfo/ipython-dev" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/ipython-dev</a><br>
</div></div></blockquote></div><br></div>