gpt4 book ai didi

python - 在解析器中报告非 fatal error 的 Pythonic 方式是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:36:35 27 4
gpt4 key购买 nike

我创建的解析器从文件中读取记录的国际象棋比赛。 API 是这样使用的:

import chess.pgn

pgn_file = open("games.pgn")

first_game = chess.pgn.read_game(pgn_file)
second_game = chess.pgn.read_game(pgn_file)
# ...

有时会遇到非法移动(或其他问题)。什么是处理它们的良好 Pythonic 方式?

  • 遇到错误立即引发异常。但是,这会使每个问题都致命,因为执行会停止。通常,仍有有用的数据已被解析并可以返回。此外,您不能简单地继续解析下一个数据集,因为我们仍处于一些读取一半的数据中间。

  • 累积异常并在游戏结束时引发它们。这使错误再次致命,但至少您可以捕获它并继续解析下一个游戏。

  • 像这样引入一个可选参数:

    game = chess.pgn.read_game(pgn_file, parser_info)
    if parser_info.error:
    # This appears to be quite verbose.
    # Now you can at least make the best of the sucessfully parsed parts.
    # ...

是否在野外使用了其中一些或其他方法?

最佳答案

最Pythonic 的方式是logging模块。它已在评论中提到,但不幸的是没有足够强调这一点。它优于 warnings 的原因有很多:

  1. 警告模块旨在报告有关潜在代码问题的警告,而不是不良用户数据。
  2. 第一个理由实际上就足够了。 :-)
  3. 日志记录模块提供可调整的消息严重性:不仅可以报告警告,还可以报告从调试消息到严重错误的任何内容。
  4. 您可以完全控制日志记录模块的输出。消息可以按其来源、内容和严重性进行过滤,以您希望的任何方式格式化,发送到不同的输出目标(控制台、管道、文件、内存等)...
  5. 日志记录模块将实际的错误/警告/消息报告和输出分开:您的代码可以生成适当类型的消息,而不必理会它们如何呈现给最终用户。
  6. 日志记录模块是 Python 代码的事实标准。每个地方的每个人都在使用它。因此,如果您的代码正在使用它,那么将它与第 3 方代码(也可能使用日志记录)相结合将变得轻而易举。好吧,也许比微风更强,但绝对不是 5 级飓风。 :-)

日志模块的基本用例如下:

import logging
logger = logging.getLogger(__name__) # module-level logger

# (tons of code)
logger.warning('illegal move: %s in file %s', move, file_name)
# (more tons of code)

这将打印如下消息:

WARNING:chess_parser:illegal move: a2-b7 in file parties.pgn

(假设您的模块名为 chess_parser.py)

最重要的是您不需要在解析器模块中做任何其他事情。您声明您正在使用日志系统,您正在使用具有特定名称的记录器(与本例中的解析器模块名称相同)并且您正在向它发送警告级别的消息。您的模块不必知道这些消息是如何处理、格式化和报告给用户的。或者如果他们被举报了。例如,您可以配置日志记录模块(通常在程序的最开始)使用不同的格式并将其转储到文件:

logging.basicConfig(filename = 'parser.log', format = '%(name)s [%(levelname)s] %(message)s')

突然间,在没有对模块代码进行任何更改的情况下,您的警告消息被保存到具有不同格式的文件中,而不是打印到屏幕上:

chess_parser [WARNING] illegal move: a2-b7 in file parties.pgn

或者您可以根据需要抑制警告:

logging.basicConfig(level = logging.ERROR)

并且您的模块的警告将被完全忽略,而来自您的模块的任何 ERROR 或更高级别的消息仍将被处理。

关于python - 在解析器中报告非 fatal error 的 Pythonic 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com