Hi Daniel,
Nice work! Comments below.

On Fri, Aug 9, 2013 at 1:40 PM, Daniel Drake <d...@laptop.org> wrote:
> Hi,
> I am experimenting with a lazy loading approach where the class
> definitions are placed in specially decorated functions. Python does
> not "descend" into such functions at import time. This causes a 25%
> improvement in "import Gtk" timing (which actually brings us down to
> pygtk2 import speed).
>
> The way to override a class in overrides is now:
>
> @class_override('Widget')
> def override_Widget():
>     class Widget(Gtk.Widget)
>         [...]
>
>      return Widget
>
> There is a new consideration if you want to access the overridden
> Widget class from another point in the overrides file - you have to go
> up to the DynamicModule instance to find it.

This is fine by me for the majority of overrides. When I first saw
your approach I momentarily thought about if we could use a straight
class decorator with metaclass magic, but I don't think it is possible
and your approach is more obvious. Out of curiosity did you attempt
other techniques or try any alternate approaches?

> I have ported Gtk and parts of GObject and GLib.

I don't think the lazy loading of something like GObject.Object will
help in practice. It might help optimizing isolated import tests, but
everything will need to load the GObject.Object override eventually.
Given that, I would like to avoid the change where we don't think it
will help in real world usage because it adds a tad bit of obfuscation
and destroys the history. We should also definitely note in the commit
message to use "git blame -w" to traverse the history without
whitespace changes. I would break the patches up starting with the new
API/mechanism as a standalone patch and use a new patch for each
override file.

It would also be nice to have regression tests which isolate the lazy
mechanics (not just that overrides work or they don't). So if
something changes later in this bit of code, we can always ensure the
lazy aspect of it continues to work right.

> Specifically, should I be worried about breaking the API between
> overrides and the core, or can I break it without worrying about
> back-compat?
>
> Right now it is backwards compatible but for cleanliness and
> efficiency I would prefer to remove the old way after porting all
> users.

I would need to know more specifics of the API in question
(gi.overrides.override?). But in general we need to keep compatibility
because there are custom overrides which other projects distribute
(GStreamer for example).

Thanks,
-Simon
_______________________________________________
python-hackers-list mailing list
python-hackers-list@gnome.org
https://mail.gnome.org/mailman/listinfo/python-hackers-list

Reply via email to