停止模块内的评估

时间:2010-07-02 01:49:01

标签: python module

我已经习惯了编写像这样工作的函数:

def f():
  if sunny:
    return
  #do non-sunny stuff

我试图找出在模块中使用的等效语法。我想做这样的事情:

if sunny:
  import tshirt
  #do something here to skip the rest of the file
import raincoat
import umbrella
#continue defining the module for non-sunny conditions

我知道我可以用if/else来写这个,但是缩进模块的其余部分似乎很愚蠢。

我可以将其余的代码移到一个单独的模块中并有条件地导入它,但这看起来很痛苦。

6 个答案:

答案 0 :(得分:2)

单独的文件和额外的缩进可能是合理的,因为开始时这是一个奇怪的事情。

根据您的实际需要,您可以继续处理所有模块主体,然后删除以后某些不合适的内容。

def foo(): 
  print "foo"
def bar(): 
  print "bar"

if sunny:
  del foo
else:
  del bar

答案 1 :(得分:1)

在同样的情况下,我并不想在我的模块中缩进整个代码。我使用异常来停止加载模块,捕获并忽略自定义异常。这使得我的Python模块非常程序化(我认为这并不理想),但它节省了一些大量的代码更改。

我有一个公共/支持模块,我在下面定义了以下内容:

import importlib

def loadModule(module):
    try:
        importlib.import_module(module)
    except AbortModuleLoadException:
        pass;

class AbortModuleLoadException(Exception):
    pass;

有了这个,如果我想"取消"或者"停止"加载模块,我会按如下方式加载模块:

loadModule('my_module');

在我的模块中,我可以针对某个条件抛出以下异常:

if <condition>:
    raise AbortModuleLoadException;

答案 2 :(得分:0)

缩小条件部分对我来说似乎没问题。如果它真的很长 - 比说一两个屏幕,我可能会将条件部分移动到单独的文件中。您的代码将更容易阅读。

答案 3 :(得分:0)

您将不得不以某种方式缩进代码。最简单的方法是在函数中定义代码并调用它们。这使if/else块保持整洁。

def do_if_sunny():
    pass

def do_if_rainy():
    pass

if sunny:
    do_if_sunny()
else:
    do_if_rainy()

或者,您可以随时使用sys.exit

if sunny:
    print "It's sunny"
    sys.exit(0)

# Continue with non-sunny conditions

答案 4 :(得分:0)

我会认真对待这个解决方案:

if sunny:
    print "it's sunny"
else:
    exec '''
print "one"
print "two"
x = 3
print x
# ETC
'''

严重不是。但它确实有效。

答案 5 :(得分:0)

您可以使用函数来执行此操作:

def foo():
    if True:
        import re
        import os
    else:
        import sys
    return locals()

locals().update(foo())

或:

def foo():
    if not True:
        import sys
        return locals()
    import re
    import os

    return locals()

locals().update(foo())