Python:分配前引用

时间:2018-09-04 20:06:16

标签: python django

我收到以下错误local variable 'ticket_reservation_expired' referenced before assignment。有人知道如何解决这个问题吗?

我认为解决方案可能是在调用函数之前分配ticket_reservation_expired = "",但是我想知道这是否是解决此问题的最佳方法吗?

helpers.py

def ticket_reservation_expired(request, timestamp_of_reservation):
    """
    * Calculate the latest possible time where tickets are still reserved.
    * Check that 'created' timestamp of reservation item is not expired.
    * If expired, error message is being generated and redirect occurs.
    """
    latest_time_before_expired = timezone.now() - timedelta(
        minutes=settings.MINUTES_TICKET_RESERVATION
    )
    if timestamp_of_reservation < latest_time_before_expired:
        messages.add_message(
            request,
            messages.ERROR,
            _("Ticket reservation is too far in the past.")
        )
        return True

views.py

ticket_reservation_expired = ticket_reservation_expired(
    self.timestamp_of_reservation
)
if ticket_reservation_expired:
    return redirect(
        'events:detail',
        organizer=self.organizer,
        event=self.event,
    )

3 个答案:

答案 0 :(得分:1)

您的函数仅在满足特定条件时才返回值。如果不满足,则不返回任何内容。好的风格是永远不要返回一个值或总是返回一个值。由于如果满足条件,您将返回True,否则将返回False,并且错误应消失。

此外,在发布的代码中,您为变量和函数命名的名称相同,这将使您无事生非。

答案 1 :(得分:-1)

问题是,如果函数不返回任何内容,则它将抛出错误,因为从未定义变量,因为变量的初始化取决于函数的返回值。只需使用None

初始化变量
ticket_reservation_expired_var = None
ticket_reservation_expired_var = ticket_reservation_expired(
    self.timestamp_of_reservation
)
if ticket_reservation_expired_var:
    return redirect(
        'events:detail',
        organizer=self.organizer,
        event=self.event,
    )

答案 2 :(得分:-2)

您可以做的是在函数内将其命名为全局引用:

global ticket_reservation_expired

在函数的第一行。或者,在函数ticket_reservation_expired中添加另一个参数,并在调用该函数时将其传递给它,以使该值有效地“转移”到函数作用域中。但是,对变量的更改将仅在函数的作用域内生效。因此,如果您需要在函数返回后自行进行“保存”更改,则global是一个选择。