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,
)