extending the break statement
Bengt Richter
bokr at oz.net
Wed Oct 22 18:49:37 EDT 2003
On 22 Oct 2003 08:06:36 -0700, mis6 at pitt.edu (Michele Simionato) wrote:
>Is there a way of "ending" a module? I would like something like this:
>
> # mod.py
> print 'something here'
> end() # some mysterious function
> print 'you should not get here'
>
> # main.py
> import mod
> print 'it works'
>
>I cannot use 'sys.exit' in place of ``end()``, since it would exit from
>the whole program and the line 'it works' would not be printed.
>I know that I can modify the main program to catch the SystemExit
>exception:
>
>
># main.py
>try:
> import mod
>except SystemExit:
> pass
>print 'it works'
>
>but I find it really ugly, since I am forced to change by hand
>all the scripts importing 'mod'. Moreover, I am abusing ``SystemExit``;
>I should add instead a new built-in exception ``EndModule``, but this
>requires even more lines of code for something that should be trivial.
>
>On the other hand, I don't like the ``if 0:`` option, i.e. writing ``mod.py``
>in the form
>
> # mod.py
> print 'something here'
> end() # some mysterious function
> if 0:
> print 'you should not get here'
>
>since it requires re-indenting by hand the (potentially long) block
>of code to be commented out. Yes, I know about C-c->, but honestly
>it is a PITA. Typically, I would like to comment out portions of
>experimental code during debugging; that code will enter in the final
>program at the end, so I must indent and re-indent it until it works
>(which means lots of times).
>
>More in general, one could think of an ``end()`` function with the ability of
>stopping the execution of the current frame and going back to the previous
>frame. One could even terminate classes in this way, i.e. skipping all the
>methods defined after the ``end()``
>
>... (some time passes) ...
>
>BTW, I have just realized that we don't need a new ``end()`` function: it would be
>enough to extend the ``break`` statement. Currently, it works only inside
>loops, why not to extend it to terminate classes and modules? IMHO, it would be
>very useful during debugging and refactoring. What do you people think?
>Or is there already same magic which can do what I ask for?
>If not, take it as a feature request ;-)
>
I wonder if one couldn't get more bang for the change-buck by breaking the
1:1 module:file relationship. I.e., if there were a way to delimit multiple
modules in a single file, then you could use that mechanism to make a dummy module
segment that would be ignored unless specifically imported one way or another.
E.g.,
====< some_module.py >========================
"""Normal module source in this section works as usual"""
...
...
# the next line here creates a package style textually nested/embedded module definition
module embedded_module: <long-delimiter-string-a-la-mime>
def this(): pass
class That(object): pass
<long-delimiter-string-a-la-mime>
# the previous line ended the embedded module definition, and here
# it's optionally possible to continue with the normal outermost module source
================================================
Thus to do what you wanted to do, just define a dummy embedded module like
#...
#... (your clean code in progress here)
#...
module dummy: some-unique-delimiter-string
#XXX# get to this later ...
Any unfinished scraps etc that might have errors or whatever
can go here
So you could use this to "comment out" the tail of
some-unique-delimiter-string
This would solve your problem (I think) and might make a new package format possible.
E.g., you could import file_level_module.textually_nested_module etc. something like
importing from a zip file. I might be a handy way to structure mini-packages.
How a module might best refer to its own embedded modules (imported or not) I don't know...
though they ought to be visible via sys.modules through its own name.
BTW, I had the notion that importing ought to be generalized to create a usable module by
any means whatever, including compiling a foreign language source and creating an extension
DLL from and importing that, etc., of course caching as usual via sys.modules.
Such a generalized importing mechanism would logically also cover ordinary Python, but then
I see an opportunity to control it with optimization and/or debugging control parameters passed
to the import. Also possibly version-specific directives. IOW, import would become a general
dynamic way of getting current-version-compatible modules into the current run time environment
using any sources and translations etc. one could conceive. Adapting to embedded-module style
files via this would be a simple variant of the general idea.
Regards,
Bengt Richter
More information about the Python-list
mailing list