On Thu, 16 Jun 2011 15:07:23 -0700, Erik Max Francis wrote: > Eric Snow wrote: >> >> The only ways that I know of to accomplish this currently is either by >> putting everything inside if-else blocks, or raise some kind of >> ImportBreak exception and catch it in an import hook. > > You're still not elucidating a very clear use case here. You want to do > some tests and then break out of the top-level execution of the module > if they happen. Just use `sys.exit`. > > It's still not clear _why_ this is useful. As I said, the typical > behavior of a module is to define a lot of things, perhaps building up > some needed data structures, and then do the `__name__ == "__main__"` > test to see if it's being executed as a script, and then _do_ something.
I'm not entirely sure that this is a *good* use case, but I think the use case that Eric Snow has in mind is something like this pseudo-code: # === in module other.py which is not the main module === def spam(): pass if some_condition: stop processing def ham(): pass def cheese(): pass def salad(): pass # === in the main module === import other other.spam() # always defined try: other.ham except AttributeError: print "there is no ham" sys.exit would be inappropriate, because the intention is not to exit the entire application, but just to halt processing of the module. You could wrap the def cheese inside an if block, but if there's a lot of conditional code, then the majority of your module might be indented, which seems silly. If Python had GOTOs this would be a perfect use-case for jumping to a label at the end of the file :) Perhaps the most sensible alternative is conditional importing: # === module extras.py === def ham(): pass def cheese(): pass def salad(): pass # === module other.py === def spam(): pass if not some_condition: from extras import * -- Steven -- http://mail.python.org/mailman/listinfo/python-list