【问题标题】:Two return statements for one method? Python一种方法的两个返回语句? Python
【发布时间】:2017-12-09 05:44:34
【问题描述】:

我有一个打印报告的方法。有两个报告使用相同的方法打印,但条件不同。我已经给出了 if-else 条件,但是由于某些原因 else 部分没有被执行! 请帮我解决这个问题

count = 80
a = 20
if a > count:
    return xyz
else:
    return abc

abc 和 xyz 是我拥有的两种不同类型的报告。

编辑: 这是我的实际功能。在每一个中,我都在获取我的记录。

            for inv_no in each:
                if inv_no.invoice_date > '2017-06-30':
                    return {
                            'type': 'ir.actions.report.xml',
                            'report_name': 'gst_invoice_print',
                            'datas': datas,
                            }
                else:
                    return {
                            'type': 'ir.actions.report.xml',
                            'report_name': 'invoice_print',
                            'datas': datas,
                            }

【问题讨论】:

  • 嗯,不会执行,因为20不大于80。
  • @DanielRoseman ,不应该执行 else 块 20 > 80 是错误的
  • 我无法重现您的问题。
  • @Meg else 总是在执行如果if 条件为假,你需要调试你的代码,祝你好运
  • 感谢大家的回复。但这只是我的问题的一个例子。我有一个有日期字段的课程。根据确定的日期,比如 7 月 1 日,应在 7 月 1 日之前和之后打印两份不同的报告。如果我单独打印之前和之后的报告,那效果很好。但是,如果我想记录日期为 30-06-2017 和 02-07-2017 的记录,我不会收到两个不同的报告。但只有一个!这是我的主要问题

标签: python return openerp


【解决方案1】:

我看到了你最后的推荐,所以这就是你应该比较日期的方式。

在将 Odoo 日期转换为 datetime 对象之前,它们是不可比较的,因此要将 odoo 日期转换为 datetime 对象,请使用:

a = datetime.strptime(self.date_field1, "%Y-%m-%d")
b = datetime.strptime(self.date_field1, "%Y-%m-%d")
# where date_field1 and date_field2 are something like this 2017-01-01
# now you can compare a and b
if a < b:
    drink beer
else:
    drink more beer

【讨论】:

    【解决方案2】:

    我不明白您的问题,因为您的代码运行良好。 下面的代码对我有用:

    count = 80
    a = 20
    def test(a, count):
        if a > count:
            return "xyz"
        else:
            return "abc"
    print test(a,count)
    

    它返回“abc”...

    【讨论】:

    • 你确定 20 总是大于 80 吗?
    【解决方案3】:

    好吧,您提供的代码总是会打印报告 abc,因为您所比较的总是返回 false(正如其他人所说)。

    如果您确实想根据情况检索两个报告中的任何一个,(在比较的情况下)一个或两个值应该是可变的。所以需要用户输入,函数的参数,或者计算机输入的(比如计算机提供的变量。比如时间)

    现在,如果您提供的代码的 sn-p 代表您的函数的一部分,并假设 count 变量正在跟踪迭代,那么您需要在迭代之后有 return 语句以确保所有内容都被计算在内为。

    for count in list:
        # Do something
    
    if a > count:
        return xyz
    else:
        return abc
    

    但是,a 变量或list 变量(不要使用列表作为变量的名称,这只是一个示例)必须是可变的。否则该函数将始终返回相同的内容。

    请注意: 如果您想要更多相关的答案,请包含更多代码,以更好地代表您所询问的内容(例如函数、类或检索输入然后操作的区域)。不要只提供存在错误的代码,还要提供导致错误的原因。

    【讨论】:

      【解决方案4】:

      所以现在我们确切地知道发生了什么,Python 的 return 语句实际上“退出”了函数而不是之后继续它。您需要的是跟踪所有报告,然后将其返回,而不是立即返回。一种方法是使用列表或元组。

      我更喜欢列表,因为它们是可变的以供将来使用,但如果您需要使用元组,请使用 ( ) 而不是 [ ]

      reports = []
      for inv_no in each:
          if inv_no.invoice_date > '2017-06-30':
              reports.append({
                              'type': 'ir.actions.report.xml',
                              'report_name': 'gst_invoice_print',
                              'datas': datas,
                              })
          else:
              reports.append({
                              'type': 'ir.actions.report.xml',
                              'report_name': 'invoice_print',
                              'datas': datas,
                              })
      
      return reports
      

      通过这种方式,您可以获得每个日期的相应报告。要稍后在代码中访问报告,请使用reports["index of list"]["key of dict"]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多