[IPython-dev] add tab completion for arguments dynamically

Matthias Bussonnier bussonniermatthias at gmail.com
Thu Mar 2 22:50:44 EST 2017


Hi Glenn,

Almost there, you need to set signature on __call__ not on the class.

In [3]: import inspect
   ...: class callme(object):
   ...:     def __call__(self,**kwargs):
   ...:         return kwargs
   ...:
   ...:
   ...: callme.__call__.__signature__ = inspect.Signature(parameters={
   ...:     inspect.Parameter('self',inspect.Parameter.POSITIONAL_OR_KEYWORD):1,
   ...:     inspect.Parameter('long_arg',inspect.Parameter.POSITIONAL_OR_KEYWORD):2
   ...:                                                            })
   ...:

In [4]: c = callme()

In [5]: c?
Signature:   c(long_arg)
Type:        callme
String form: <__main__.callme object at 0x11020fb00>
Docstring:   <no docstring>

This seem to work for me on tab completion.
-- 
M

On Thu, Mar 2, 2017 at 7:20 PM, G Jones <glenn.caltech at gmail.com> wrote:
> Hi Matthias,
> This seems to be exactly what I'm looking for, and it works fine when I
> attach a __signature__ attribute to a simple function. I had to install
> funcsigs because the project I'm working on is stuck with py2.7.
> However, I am having trouble making it work for a callable class:
>
> In [53]: class callme(object):
>     ...:     def __call__(self,**kwargs):
>     ...:         return kwargs
>     ...:     __signature__ =
> funcsigs.Signature(parameters=[funcsigs.Parameter('long_arg',funcsigs.Parameter.POSITIONAL_OR_KEYWORD)])
>
> In [54]: c = callme()
>
> In [55]: c?
> Type:           callme
> String form:    <__main__.callme object at 0x7f63e7124350>
> Signature:      c(long_arg)
> Docstring:      <no docstring>
> Call signature: c(**kwargs)
>
> So far so good, the signature is seen as expected. However, when I try to
> tab complete with "c(long<tab>", long_arg is not in the list of suggestions.
>
> Is there a way to accomplish this for a callable class?
>
> Thanks,
> Glenn
>
> On Thu, Mar 2, 2017 at 4:25 PM, Matthias Bussonnier
> <bussonniermatthias at gmail.com> wrote:
>>
>> Hi Glenn,
>>
>> You can set the `__signature__` of your object. likely possible with a
>> decorator.
>> Here is a short example of how you could do it in a REPL.
>>
>>
>> In [21]: from inspect import Signature, Parameter
>>
>> In [22]: def foo(*kwargs):
>>     ...:     pass
>>
>> In [23]: foo?
>> Signature: foo(*kwargs)
>> Docstring: <no docstring>
>> File:      ~/dev/docathon/<ipython-input-22-086da1400d07>
>> Type:      function
>>
>> In [24]: foo.__signature__ = Signature(parameters={Parameter('a',
>> Parameter.POSITIONAL_OR_KEYWORD):None})
>>
>> In [25]: foo?
>> Signature: foo(a)
>> Docstring: <no docstring>
>> File:      ~/dev/docathon/<ipython-input-22-086da1400d07>
>> Type:      function
>>
>>
>> That should  not only work with IPython, but with anything that use
>> the Python inspect library.
>>
>> Note that what I do above is imperfect as you should use an
>> OrderedDict instead of a dict for `parameters=...`
>>
>> Does that helps ?
>>
>> --
>> M
>>
>>
>> On Thu, Mar 2, 2017 at 12:58 PM, G Jones <glenn.caltech at gmail.com> wrote:
>> > Hi,
>> > Is it possible to customize the completion list when typing keyword
>> > arguments?
>> > For example suppose I have a function like:
>> > def myfunc(**kwargs):
>> >     val = kwargs['val']
>> >
>> > is there a way to tell ipython that when it sees me type:
>> > myfunc(va<tab>
>> >
>> > it suggests "val="?
>> >
>> > Thanks,
>> > Glenn
>> >
>> >
>> >
>> > _______________________________________________
>> > IPython-dev mailing list
>> > IPython-dev at scipy.org
>> > https://mail.scipy.org/mailman/listinfo/ipython-dev
>> >
>> _______________________________________________
>> IPython-dev mailing list
>> IPython-dev at scipy.org
>> https://mail.scipy.org/mailman/listinfo/ipython-dev
>
>
>
> _______________________________________________
> IPython-dev mailing list
> IPython-dev at scipy.org
> https://mail.scipy.org/mailman/listinfo/ipython-dev
>



More information about the IPython-dev mailing list