Python:在赋值之前引用

Python:在赋值之前引用,python,django,Python,Django,我收到分配前引用的以下错误局部变量“ticket\u reservation\u expired”。有人知道如何解决这个问题吗 我认为一个解决方案是在调用函数之前分配票务预订\u expired=“,但我想知道这是否是解决此问题的最佳方法 helpers.py def ticket_reservation_expired(request, timestamp_of_reservation): """ * Calculate the latest possible time whe

我收到分配前引用的以下错误
局部变量“ticket\u reservation\u expired”
。有人知道如何解决这个问题吗

我认为一个解决方案是在调用函数之前分配
票务预订\u 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

您可以做的是使该名称成为函数内部的全局引用:

global ticket_reservation_expired

这是函数的第一行。或者,将另一个参数添加到函数
ticket\u reservation\u expired
,并在调用函数时将其传入,以便将值有效地“转移”到函数范围。但是,对变量的更改仅在函数范围内生效。因此,如果您需要在函数返回后自行“保存”任何更改,则可以选择
global

问题是,如果函数不返回任何内容,那么它将抛出一个错误,因为变量从未定义过,因为变量的初始化取决于函数的返回值。只需使用
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,
    )

函数仅在满足特定条件时返回值。如果不满足,则不会返回任何内容。好的风格是不返回值或总是返回值。因为如果条件满足,则返回True;如果条件不满足,则返回False,错误应该消失


另外,在您发布的代码中,您将变量和函数命名为相同的名称,这将给您带来无尽的麻烦。

为什么不直接用None初始化它呢@PatrickArtner他没有修改函数中的变量,而是使用不同的参数计算时间增量。因此,如果函数调用没有返回任何内容,则使用None初始化将防止他意外访问变量。另外,默认情况下,只有在满足条件的情况下才可以返回False和True。我刚刚发现,我将它们命名为相同名称的原因也出现了问题。删除后,我可以使用我的功能。谢谢你的帮助!不客气。返回值最终也会给你带来麻烦,我建议你也把它修好。我现在也返回False。谢谢你。帮了大忙!解决这个问题的方法是函数和变量不应该有相同的名称。如果函数没有显式返回任何内容,python会让它隐式返回
None
。你的文字表明,否则,威奇是错的。删除
ticket\u reservation\u expired\u var=None
-使用
pass
重新运行函数的所有内容,并打印
ticket\u reservation\u expired\u var
,以进行验证
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,
    )