Another form of dynamic import

Kay Schluehr kay.schluehr at
Wed Mar 25 17:13:44 CET 2009

On 25 Mrz., 15:23, Marco Nawijn <naw... at> wrote:
> Hello,
> In short I would like to know if somebody knows if it is possible to
> re-execute a statement that raised an exception? I will explain the
> reason by providing a small introduction on why this might be nice in
> my case
> and some example code.
> I am using the python bindings to a *very* large C++ library. About
> 5000 classes divided over approx. 450 different
> packages are exposed through the Python interface. To reduce the
> number of import statements that need to be inserted and to limit the
> number of wildcard imports it would be very helpful if class names
> could be automatically imported from the proper module. There is no
> problem in finding out the proper module given a (valid) class name.
> As an example, look at the following statement
> >> aPoint = gp_Pnt(1.0, 0.0, 0.0)     # Oops, this will raise a NameError, since
>                                                       # gp_Pnt class
> is unknown
> NameError: name 'gp_Pnt' is not defined
> As indicated, this will raise a NameError exception. What I would like
> to do is something like the following (pseudo-code):
> try:
>     ....
>     ....
>     aPoint = gp_Pnt(1.0, 0.0, 0.0)    [1]
>     ....
>     ....
> except NameError, e:
>      name = e.args[0].split[1]
>      if isValid(name):
>           doImport(name)
> ===> Can I go back to statement [1] from this point?
>      else:
>          raise e
> There is no problem in catching the exception, finding out which name
> is unknown to python and check if this is a valid name for my library.
> My question is, is there any possibility of going back to the
> statement that raised the error, re-execute the statement and
> continue?
> Thanks for any thoughts and suggestions.
> Marco

There is no call/cc continuation in Python when you are asking for
such a thing.

I wonder however why you don't try lazy attribute access? Instead of
making a raw function call like that to gp_Pnt, one can thread all
calls to the C++ system through an object that implements __getattr__
and loads new names incrementally if one is missing.

More information about the Python-list mailing list