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”分开。我觉得这容易多了