我已经习惯了编写像这样工作的函数:
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
来写这个,但是缩进模块的其余部分似乎很愚蠢。
我可以将其余的代码移到一个单独的模块中并有条件地导入它,但这看起来很痛苦。
答案 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())