【问题标题】:Ensure either all the function inside a "for" loop runs or none of it does确保 \"for\" 循环中的所有函数都运行或都不运行
【发布时间】:2022-11-12 18:26:19
【问题描述】:

我正在做一个项目,我需要提取-> 上传-> 从源到目的地删除数据。

虽然“for”循环获取每个表名并一次运行一个(提取/上传/删除)函数,但对于每个表,我希望所有三个函数都运行,如果其中一个或多个函数失败,则没有一个该功能将运行。

为简单起见,我有一个虚拟循环,我知道前两个语句会运行,但第三个语句会失败。但是我如何以某种方式设置循环,以便它们全部运行,或者如果有一个错误,那么它们都不会运行。

table = ['tempA', 'tempB']
extract = 'extract data'
upload = 'upload data'


for x in table:
    print(f"{x} table {extract}")
    print(f"{x} table {upload}")
    print(f"{x} table {delete}")

我尝试了“try”和“except”,但最终为两个表运行了前两个打印语句,并给了我最后一个的错误消息。

for x in table:
    try:
        print(f"{x} table {extract}")
        print(f"{x} table {upload}")
        print(f"{x} table {delete}")
    except Exception as e:
        print(e)

【问题讨论】:

  • 这是不可能的。您将无法知道函数在调用之前是否会失败。
  • 你想要的是一个事务机制,它仍然单独运行函数,但可以展开效果较早的,如果任何后来的失败。如果您使用的是实际数据库,则几乎可以肯定这是可用的。
  • 看看我的回答。
  • 就像 Michael M. 所说的那样,这在 python 中是不可能的,因为 python 只知道函数在调用时会失败。也就是说,你的桌子住在哪里?如果是 SQL,则在失败时回滚事务是一种标准做法,应该可以实现您的目标? (SQL alchemy 是一个 Python 库,对这种行为有很好的支持)

标签: python function for-loop


【解决方案1】:

这不是一个好方法,但这是您可以尝试的方法。注意:这是一个粗略的模块,因为您没有提供功能代码

for x in table:
    try:
        extract1 = extract()
        upload1 = upload()
        delete1 = delete() # Call the 3 functions
        print(f"{x} table {extract1}")
        print(f"{x} table {upload1}")
        print(f"{x} table {delete1}")
    except Exception as e:
        print(e)

这将调用所有 3 个函数,如果其中任何一个函数失败,那么它将直接打印异常。这种方法以类似的方式工作。

【讨论】:

  • 但这只会隐藏前两个函数实际执行的事实
猜你喜欢
  • 2015-11-26
  • 2023-04-08
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多