<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 7, 2017 at 9:27 PM, Guido van Rossum <span dir="ltr"><<a href="mailto:guido@python.org" target="_blank">guido@python.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="gmail-">On Mon, Nov 6, 2017 at 10:36 PM, Stéfane Fermigier <span dir="ltr"><<a href="mailto:sf@fermigier.com" target="_blank">sf@fermigier.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span>On Tue, Nov 7, 2017 at 2:58 AM, Guido van Rossum <span dir="ltr"><<a href="mailto:guido@python.org" target="_blank">guido@python.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="gmail-m_-4672741109686181492m_2469706551119843501gmail-">On Mon, Nov 6, 2017 at 2:34 AM, Stéfane Fermigier <span dir="ltr"><<a href="mailto:sf@fermigier.com" target="_blank">sf@fermigier.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>4) 10 years ago, when I was working on the EDOS project ( <a href="http://cordis.europa.eu/pub/ist/docs/directorate_d/st-ds/edos-project-story_en.pdf" target="_blank">http://cordis.europa.eu/pub/is<wbr>t/docs/directorate_d/st-ds/edo<wbr>s-project-story_en.pdf</a> ), I ran a small experiment where I used, IIRC, the profile hook to intercept all function / method calls, and log information about arguments and return value types to a gigantic log file. Then the log file could be parsed and these information used to suggest type annotations. Except there were no type annotations at the time in Python.</div><div><br></div><div>I know PyCharm can do a similar thing now: you run your program or your tests under the debugger, it logs runtime type information somewhere, and then can use it to suggest autocompletion or maybe type annotations.</div></div></blockquote><div><br></div></span><div>I didn't know this. Do you know where there are docs for this feature?<br></div></div></div></div></blockquote><div><br></div></span><div>This was described in this blog post when first introduced:</div><div><br></div><div><a href="https://blog.jetbrains.com/pycharm/2013/02/dynamic-runtime-type-inference-in-pycharm-2-7/" target="_blank">https://blog.jetbrains.com/pyc<wbr>harm/2013/02/dynamic-runtime-<wbr>type-inference-in-pycharm-2-7/</a></div><div><br></div><div>And more tersely, in the documentation: <a href="https://www.jetbrains.com/help/pycharm/python-debugger.html" target="_blank">https://www.jet<wbr>brains.com/help/pycharm/python<wbr>-debugger.html</a></div></div></div></div></blockquote><div> </div></span><div>Oh. It sounds like it doesn't generate stubs or PEP 484 annotations.<br></div></div></div></div></blockquote></div><div class="gmail_extra"><br></div>The blog post was written in 2013, PEP 484 was not yet adopted at the time, and so they targeted their own typechecker and typing annotation conventions, which were at the time based on docstrings conventions.</div><div class="gmail_extra"><br></div><div class="gmail_extra">I have just checked with the current PyCharm version, and when using the "add annotation" intention, they're using now either the "# type: (...) -> ...", or the PEP484 conventions, depending on the version of Python you're using for your particular workspace.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Also, I found the the call signature collection mechanism during debug run seems to live in the PyDev.Debugger project (<a href="https://github.com/fabioz/PyDev.Debugger/">https://github.com/fabioz/PyDev.Debugger/</a> which is common to PyDev and PyCharm), more specifically here: <a href="https://github.com/fabioz/PyDev.Debugger/blob/master/_pydevd_bundle/pydevd_signature.py">https://github.com/fabioz/PyDev.Debugger/blob/master/_pydevd_bundle/pydevd_signature.py</a></div><div class="gmail_extra"><br></div><div class="gmail_extra">  S.</div><div class="gmail_extra"><br></div><div class="gmail_extra">-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Stefane Fermigier - <a href="http://fermigier.com/" target="_blank">http://fermigier.com/</a> - <a href="http://twitter.com/sfermigier" target="_blank">http://twitter.com/sfermigier</a> - <a href="http://linkedin.com/in/sfermigier" target="_blank">http://linkedin.com/in/sfermigier</a><br>Founder & CEO, Abilian - Enterprise Social Software - <a href="http://www.abilian.com/" target="_blank">http://www.abilian.com/</a><br>Chairman, Free&OSS Group / Systematic Cluster - <a href="http://www.gt-logiciel-libre.org/" target="_blank">http://www.gt-logiciel-libre.org/</a><br>Co-Chairman, National Council for Free & Open Source Software (CNLL) - <a href="http://cnll.fr/" target="_blank">http://cnll.fr/</a><div>Founder & Organiser, PyData Paris - <a href="http://pydata.fr/" target="_blank">http://pydata.fr/</a><br></div><div>---</div><div><div>“You never change things by fighting the existing reality. To change something, build a new model that makes the existing model obsolete.” <span style="font-size:12.8px">— R. Buckminster Fuller</span></div></div><div><br><br></div></div></div></div></div></div></div></div>
</div></div>