Python 肾盂法;旗帜;概念
考虑以下情况:Python 肾盂法;旗帜;概念,python,Python,考虑以下情况: flag='a' 尽管如此: 尝试: #可能失败的事情 除: #修复故障 标志='b' 其他: 打破 打印(标志) 我觉得在这种情况下,必须有一种更好的方法来找出发生了什么而不使用标志,但我想不出任何更“pythonic”的方法。您可以将异常/默认情况的处理拉入块,而不是和else块。然而,这是不同的代码,因为现在在退出while循环后,您将在每个异常上打印一次,而不是只打印一次,因此这对于尝试/更为合理,除了循环之外的/else。如果您在循环中,但仍然只想在循环完成时打印一次
flag='a'
尽管如此:
尝试:
#可能失败的事情
除:
#修复故障
标志='b'
其他:
打破
打印(标志)
我觉得在这种情况下,必须有一种更好的方法来找出发生了什么而不使用标志,但我想不出任何更“pythonic”的方法。您可以将异常/默认情况的处理拉入
块,而不是和else
块。然而,这是不同的代码,因为现在在退出while
循环后,您将在每个异常上打印一次,而不是只打印一次,因此这对于尝试/更为合理,除了循环之外的/else
。如果您在循环中,但仍然只想在循环完成时打印一次(即,一旦没有引发异常),我认为您的方法已经足够清楚了
为True时:
尝试:
#可能失败的事情
除:
#修复故障
打印(“b”)
其他:
打印(“a”)
打破
您可以将异常/默认情况的处理拉入块,而不是块和块。然而,这是不同的代码,因为现在在退出while
循环后,您将在每个异常上打印一次,而不是只打印一次,因此这对于尝试/更为合理,除了循环之外的/else
。如果您在循环中,但仍然只想在循环完成时打印一次(即,一旦没有引发异常),我认为您的方法已经足够清楚了
为True时:
尝试:
#可能失败的事情
除:
#修复故障
打印(“b”)
其他:
打印(“a”)
打破
我认为这更像是一个一般的编程问题。用好名字来表达你的意思。“旗帜”是什么意思?将其重命名为“done”并重新阅读代码,在一个简单的while循环中会看到大量不必要的内容
numerator = 1
denominator = 0
done = False
while not done:
try:
x = numerator // denominator
done = True
except:
denominator = 1
但是为了更好地说明发生了什么以及为什么,我们需要添加日志记录(也是通用编程,而不是专门的pythonic)。例如,这将允许您跟踪许多不同异常处理程序中的许多不同代码路径
import logging
# one time setup, can be in a different file
log = logging.getLogger('myapp')
log.setLevel(logging.ERROR)
fh = logging.FileHandler('myapp.log')
log.addHandler(fh)
log.info('about to begin')
done = False
while not done:
try:
x = n // d
done = True
except NameError as e:
log.error('oops forgot to initialize: ' + str(e))
n = 1
d = 0
except ZeroDivisionError as e:
log.error('division by zero')
d = 1
except Exception as e:
log.error('unknown error: ' + str(e))
log.info('done')
错误将存储在您指定的日志文件中。您可以控制它是否记录日志,以及日志放在哪里。例如,我有“开始”和“结束”的log.info消息,但您并不总是想要所有信息。他们不记录日志,因为我将日志级别设置为ERROR,所以此日志文件“myapp.log”将只包含log.ERROR消息
如果你真的想知道它,可以把日志记录想象成一个打印语句,只在你想要它去的地方,这样你就可以有效地把它留在那里。logging.DEBUG消息特别有助于在调试程序时了解程序中发生了什么情况,但稍后通过设置不同的日志记录级别将其禁用。我认为这更像是一个一般编程问题。用好名字来表达你的意思。“旗帜”是什么意思?将其重命名为“done”并重新阅读代码,在一个简单的while循环中会看到大量不必要的内容
numerator = 1
denominator = 0
done = False
while not done:
try:
x = numerator // denominator
done = True
except:
denominator = 1
但是为了更好地说明发生了什么以及为什么,我们需要添加日志记录(也是通用编程,而不是专门的pythonic)。例如,这将允许您跟踪许多不同异常处理程序中的许多不同代码路径
import logging
# one time setup, can be in a different file
log = logging.getLogger('myapp')
log.setLevel(logging.ERROR)
fh = logging.FileHandler('myapp.log')
log.addHandler(fh)
log.info('about to begin')
done = False
while not done:
try:
x = n // d
done = True
except NameError as e:
log.error('oops forgot to initialize: ' + str(e))
n = 1
d = 0
except ZeroDivisionError as e:
log.error('division by zero')
d = 1
except Exception as e:
log.error('unknown error: ' + str(e))
log.info('done')
错误将存储在您指定的日志文件中。您可以控制它是否记录日志,以及日志放在哪里。例如,我有“开始”和“结束”的log.info消息,但您并不总是想要所有信息。他们不记录日志,因为我将日志级别设置为ERROR,所以此日志文件“myapp.log”将只包含log.ERROR消息
如果你真的想知道它,可以把日志记录想象成一个打印语句,只在你想要它去的地方,这样你就可以有效地把它留在那里。logging.DEBUG消息特别适用于在调试程序时了解程序中何时发生了问题,但稍后通过设置不同的日志级别将其禁用。我喜欢另一种模式:
将不安全函数包装在一个安全函数中,该函数在失败时将返回False或None
设置初始值
在
例如:
# It only works for positive numbers
In [24]: def run_safe(x):
...: if x < 0:
...: x = 0
...: try:
...: return 100 / x
...: except Exception:
...: return None
In [25]: i = -4
In [26]: while run_safe(i) is None:
...: print("i={} failed".format(i))
...: i += 1
...:
...:
i=-4 failed
i=-3 failed
i=-2 failed
i=-1 failed
i=0 failed
# At the end i has the value that succeeds
In [27]: print(i)
1
#它只适用于正数
在[24]:def安全运行(x):
…:如果x<0:
…:x=0
…:试试看:
…:返回100/x
…:例外情况除外:
…:返回无
在[25]中:i=-4
在[26]中:虽然运行安全(i)为无:
…:打印(“i={}失败”。格式(i))
…:i+=1
...:
...:
i=-4失败
i=-3失败
i=-2失败
i=-1失败
i=0失败
#最终我拥有了成功的价值
In[27]:print(i)
1.
对我来说,这种方法将风险代码(现在存在于函数中)与while循环中的“fix”分开。我发现当任何一个代码(风险代码或修复代码)都很复杂时,这更容易阅读。我喜欢另一种模式:
将不安全函数包装在一个安全函数中,该函数在失败时将返回False或None
设置初始值
在
例如:
# It only works for positive numbers
In [24]: def run_safe(x):
...: if x < 0:
...: x = 0
...: try:
...: return 100 / x
...: except Exception:
...: return None
In [25]: i = -4
In [26]: while run_safe(i) is None:
...: print("i={} failed".format(i))
...: i += 1
...:
...:
i=-4 failed
i=-3 failed
i=-2 failed
i=-1 failed
i=0 failed
# At the end i has the value that succeeds
In [27]: print(i)
1
#它只适用于正数
在[24]:def安全运行(x):
…:如果x<0:
…:x=0
…:试试看:
…:返回100/x
…:例外情况除外:
…:返回无
在[25]中:i=-4
在[26]中:虽然运行安全(i)为无:
…:打印(“i={}失败”。格式(i))
…:i+=1
...:
...:
i=-4失败
i=-3失败
i=-2失败
i=-1失败
i=0失败
#最终我拥有了成功的价值
In[27]:print(i)
1.
对我来说,这种方法将风险代码(现在存在于函数中)与while循环中的“fix”分开。我觉得这容易多了