我刚刚写了一大堆代码,这些代码让我觉得它比最优化的嵌套要多得多.我想了解如何改进这种风格的建议,尤其是它更符合"Flat比嵌套更好".
for app in apps:
if app.split('.', 1)[0] == 'zc': #only look for cron in zc apps
try:
a = app + '.cron'
__import__(a)
m = sys.modules[a]
try:
min = m.cron_minute()
for job in min:
k.add_interval_task(job[0], 'minute task', r(M_LB, M_UB),
60*job[1],
kronos.method.threaded, (), ())
except AttributeError: #no minute tasks
pass
try:
hour = m.cron_hour()
for job in hour:
k.add_daytime_task(job[0], 'day task', range(1, 8), None,
(job[1], r(H_LB, H_UB)),
kronos.method.threaded, (), ())
except AttributeError: #no hour tasks
pass
except ImportError: #no cron jobs for this module
pass
Run Code Online (Sandbox Code Playgroud)
编辑: 结合下面的建议,这是我的改写形式.
for app in apps:
if app.split('.', 1)[0] != 'zc': #only look for cron in zc apps
continue
try:
a = app + '.cron'
__import__(a)
except ImportError: #no cron jobs for this module, continue to next one
continue
m = sys.modules[a]
if hasattr(m, 'cron_minute'):
min = m.cron_minute()
for job in min:
k.add_interval_task(job[0], 'minute task', r(M_LB, M_UB),
60*job[1],
kronos.method.threaded, (), ())
if hasattr(m, 'cron_hour'):
hour = m.cron_hour()
for job in hour:
k.add_daytime_task(job[0], 'day task', range(1, 8), None,
(job[1], r(H_LB, H_UB)),
kronos.method.threaded, (), ())
Run Code Online (Sandbox Code Playgroud)
主要的问题是你的尝试条款过于宽泛,特别是最外层的条款:有了这种习惯,你迟早会遇到一个神秘的错误,因为你的一个尝试/除了意外地隐藏了一个意外的异常"冒泡"来自你正在打电话的其他一些功能.
所以我建议,相反:
for app in apps:
if app.split('.', 1)[0] != 'zc': #only look for cron in zc apps
continue
try:
a = app + '.cron'
__import__(a)
except ImportError: #no cron jobs for this module
continue
# etc etc
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我也用另一种方式应用"扁平比嵌套更好"(不依赖于任何尝试/除外),"如果我在循环的这一段没有更多的事情要做,继续[即继续前进]到循环的下一个循环]而不是"如果我有事情要做:"后面跟着大量嵌套代码.我总是喜欢这种样式(if/continue或if/return)嵌套if语言提供功能,如continue(基本上所有现代的,因为C有它;-).
但这是一个简单的"扁平与嵌套"风格偏好,问题的关键在于:保持你的试用条款小!最糟糕的情况是,当你不能简单地继续或在except子句中返回时,你可以使用try/except/else:在try子句中只放入绝对必须存在的东西 - 可能和预期的一小段代码raise - 并在else子句中放入以下代码的其余部分(不应该也不应该引发的部分).这不会改变嵌套,但是在降低意外隐藏不期望的异常的风险方面做了很大的改变!