[Libreoffice] candidate for a new python section in SDK examples page

Michael Meeks michael.meeks at suse.com
Thu Dec 8 02:00:24 PST 2011


On Wed, 2011-12-07 at 23:44 +0100, Lionel Elie Mamane wrote:
> > 	So - I know what __import__ is meant to do - but it appears to
> > return an entirely useless object; one that has nothing even
> > slightly helpful associated with it that would let me find an
> > associated member variable.
> 
> We seem to have a deep, deep chasm, because things that are natural /
> intuitive to me seem to be completely misunderstood by you. 

	:-) I'm not sure it's -that- deep - -clearly- from the docs this object
is trying to be a simple name/value property-bag grab-bag. That is clear
enough; the problem is - -what- is in the grab-bag; or (more to the
point) why are there a badzillion built-in things, and not the things I
want ? how does this 'module' map relate to the .py files which are it's
children ?

> The core thing to understand is that a function is not in any way a
> "special" category. It is just a value that can be applied, that can

	Sure - I'm blown away by the sheer meta-ness of it ;-) everything is an
everything and so on :-) But concretely, I don't care - I just want to
understand this:

	* for a given structure of a python module:
		fax/
			__init__.py
			FooBaaBaz.py
			BingBongDing.py

	* what can I expect my 'module' meta-thing to look like ?
		+ ie. given that it contains nothing of any usefulness
		  that I can find; how can I extract the global instance
		  g_magicNameFoo defined in FooBaaBaz.py ?
		+ why can I still not get it if I load
		  fax.FooBaaBaz ?
		+ why does it still not work for fax if I define this
		  magic in __init__.py ?
		+ how does that module structure flatten into this
		  hash ?

> So, it is quite natural (in the Python approach) that a module is just
> a wrapper around a dictionary.

	That is fine - the question is - how is (what looks like a non-flat
hierarchical object) flattened into a flat dictionary ? and where is
that documented ?

> You want to know whether module m defines name FOO?
> "hasattr(m, 'FOO')" will tell you. Either True or False.

	Sure - so much is obvious; that is clearly what it -should- do; but
what does "module m defines name FOO" mean ? where does FOO have to be
defined ? clearly it works if I load/compile etc. the foo.py file - then
the namespacing works and I get what I expect. Without that - how can I
get g_MagicInstanceVariable into the global module scope ?

> But I get the impression that you know that, so that I'm not sure what
> is your issue or question. Let's continue...

	Yes :-) my question is - where is the documentation for any of the "how
a set of files in a module interact and how are there symbols exposed,
-and- how are they flattened into this hash -and- if I cannot find the
symbol at the top-level, how can I traverse this tree - when I get only
a dictionary with nothing I can see that is useful for going down a
level inside it ;-)

> If for some reason you don't want to be liberal and use duck typing,
> and want to force implHelper to be created by
> unohelper.ImplementationHelper() (or a derived class), you can use a
> subytping model:

	Of course, that would be a good check to have I guess ;-) but I'm not
so interested in that, I just want something that works.

> > 	Sure -none of these are what I want; I want to hook out any
> > g_ImplementationHelper instances that are around.
> 
> What is "hook out"? Whatever that is, just get the
> g_ImplementationHelper attribute and do whatever you want with it.

	Sure - except it doesn't work ;-)

> > 	Having some nice way to dump all the available methods, and/or classes
> > on a module
> 
> m.__dict__.keys() gives the set of bound names as a list.

	Sure - and I get a huge list of (mostly) built-ins, with chatty
contents; if there is some way to traverse down to the component .py
files / classes that are embedded in this module, it is really unclear
to me.

> Maybe instead of discussing things in generality, we should dive into
> the concrete problem you are having? Give me UNO/LibreOffice
> n00b/beginner-proof instructions on how to reproduce the problem.

	Sure :-) So - drop this services.rdb over your existing
programservices/services.rdb; unfortunately (it is all one line) .rdb
files are not patch-able. The substantive change is:

  <component loader="com.sun.star.loader.Python"
	     uri="vnd.openoffice.pymodule:wizards.fax">
    <implementation name="com.sun.star.wizards.fax.CallWizard">
      <service name="com.sun.star.wizards.fax.CallWizard"/>
    </implementation>
  </component>

	Re-start, and File->Wizards->Fax should produce this on the console:

pythonloader.Loader ctor
pythonloader.Loader.activate
pythonloader: interpreting url vnd.openoffice.pymodule:wizards.fax
pythonloader: after expansion vnd.openoffice.pymodule:wizards.fax
Warning: Python module loading is almost certainly pre-broken
dump stuff
Fetched ImplHelper as None

	I would expect ImplHelper to not be Null, or have some way of getting
that instance out of the module. I tried all manner of ways of forcing
the modules to get imported inside the __init__.py none of which helped
here.

	Help much appreciated :-)

	ATB,

		Michael.

-- 
michael.meeks at suse.com  <><, Pseudo Engineer, itinerant idiot
-------------- next part --------------
A non-text attachment was scrubbed...
Name: services.rdb.gz
Type: application/x-gzip
Size: 15899 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20111208/a31e5373/attachment-0001.bin>


More information about the LibreOffice mailing list