how to deal with inspect.getargspec() deprecation?

1,494 views
Skip to first unread message

Tim Graham

unread,
Jun 10, 2015, 2:49:25 PM6/10/15
to django-d...@googlegroups.com
inspect.getargspec() was deprecated in Python 3.0 and will be removed in 3.6 (ETA late 2016). It started throwing a deprecation warning in Python 3.5 which causes some test failures when we check the number of deprecation warnings so I'd like to deal with it now and avoid introducing more usages.

Its replacement is inspect.signature() which is in all the versions of Python 3 we support, but not 2.7. Options I see:
1. Add a dependency for the funcsigs backport [1] (only needed on Python 2)
2. Vendor funcsigs in django.utils (about 1k LOC) (this has been the historical approach)
3. Write different code for Python 2 & 3

[1] https://github.com/aliles/funcsigs

Carl Meyer

unread,
Jun 10, 2015, 3:09:15 PM6/10/15
to django-d...@googlegroups.com
I'd say either 1 or 2. Personally I feel the ecosystem is ready for
Django to have dependencies, and we could go with 1. But maybe a 1k LOC
back-compat lib, which would likely be trivial to vendor, isn't the best
case for that first required dependency.

Carl

signature.asc

Marc Tamlyn

unread,
Jun 10, 2015, 3:41:26 PM6/10/15
to django-d...@googlegroups.com
I'm not sure how similar the return values are, is it possible to write (and contribute upstream) a six move? Perhaps this is impossible without funcsigs though.

Marc


--
You received this message because you are subscribed to the Google Groups "Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To post to this group, send email to django-d...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/55788B4E.2060409%40oddbird.net.
For more options, visit https://groups.google.com/d/optout.

Berker Peksağ

unread,
Jun 10, 2015, 3:49:10 PM6/10/15
to django-d...@googlegroups.com
funcsigs doesn't look like an up-to-date backport and we've fixed many
bugs in inspect.signature() in recent releases. It might be safer to
go with 3 (instead of adding an unmaintained dependency).

--Berker

Carl Meyer

unread,
Jun 10, 2015, 3:50:52 PM6/10/15
to django-d...@googlegroups.com
If that's true, then we should write our own backport that covers the
cases we need (and consider contributing it to six, as Marc suggested).
We shouldn't rewrite the compatibility code every place we need an
argument signature (which is how I interpret option 3).

Calr

signature.asc

Tim Graham

unread,
Jun 10, 2015, 5:45:30 PM6/10/15
to django-d...@googlegroups.com
The APIs are rather different. I will keep working on the conversions (we'll need them no matter which option we pick), but here's a flavor: https://github.com/django/django/pull/4846

Tim Graham

unread,
Jun 13, 2015, 2:13:26 PM6/13/15
to django-d...@googlegroups.com
I ended up abstracting our usage of inspect.getargspec() into some utility methods in a django.utils.inspect module. Each method has a separate branch for Python 2 and Python 3. It's not ideal, but I think it's preferable to adding a short-lived dependency or vendored copy, considering that dropping Python 2 in master is < 2 years out.

https://github.com/django/django/pull/4846
Reply all
Reply to author
Forward
0 new messages