[Zope] Help - cannot import zexp

Oleg Broytmann Oleg Broytmann <phd@mail2.phd.pp.ru>
Mon, 4 Dec 2000 12:17:25 +0300 (MSK)


Hi!

   I already got it! :) I imported earlier zexp and removed default args
from the External Method. The site now seems to do export/import
flawlessly.

   As I said, it's undocumented misfeature. Thanks for documenting it. Can
you make it a Tip or a HOWTO and publish it on zope.org?

On Sun, 3 Dec 2000, Dieter Maurer wrote:
> Oleg Broytmann writes:
>  > .... functions as default parameters to external method functions
>  > cause import problems ....
>  > ....
>  >    "Cannot import default_render from module __main__". Oops! What's that?
>  > The default_render isn't in __main__, sure. I tried to create External
>  > Method before importing, but this didn't help :(
> This is a severe danger of "pickle" and the external method
> implementation:
>
>   *  the implementation does not import the Python source files
>      but reads them in and executes them.
>
>      All functions and classes appear to be defined in the
>      module "__main__".
>
>   *  The implementation places the function default arguments
>      into the ZODB (as a pickle).
>
>   *  "unpickle" cannot load the corresponding object,
>      as it imports "__main__" and looks there for the
>      function -- in vain.
>
>
> As a rule:
>
>   Avoid the use of class of function definitons from
>   an external method source file for anything that
>   may be written to the ZODB (or more generally
>   be pickled; this applies e.g. to session context, too).
>   This includes created object instances that may
>   end up as attributes of Zope objects or
>   function default parameters to external methods.
>
> If you defined such classes or functions in a true
> Python module, you should have no problem.
>
>
>
> What can you do, if your zexp is valuable?
>
>   *  put a dummy definition of "default_render" in the
>      "__main__" module.
>
>      You should then be able to import your zexp
>      and change the problematic external method.
>
>      I do not know precisely, what Zope's "__main__"
>      module is. I expect the "z2.py".
>      If this is not the case, then a small dummy product
>      that does "import __main__; __main__.default_render= 0"
>      should do the trick, whatever "__main__" may be.

Oleg.
----
     Oleg Broytmann     http://www.zope.org/Members/phd/     phd@phd.pp.ru
           Programmers don't die, they just GOSUB without RETURN.