Opened 8 years ago

Last modified 7 years ago

#26988 closed Cleanup/optimization

User is_authenticated callable property is confusing to check — at Version 2

Reported by: Mark Tranchant Owned by: nobody
Component: contrib.auth Version: 1.10
Severity: Release blocker Keywords: user is_authenticated property test
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Mark Tranchant)

Just upgraded to 1.10, converted all is_authenticated() methods into is_authenticated properties as per the Release Notes and a test in my test suite failed.

It turns out I was checking for a logged in user with if request.user.is_authenticated is False:, but the is_authenticated property is actually a CallableBool which cannot be tested with {{== False}}, {{is False}}, {{== True}} or {{is True}}.

Checking this property only gives logical results with direct if user.is_authenticated or if not user.is_authenticated. This is very misleading and non-intuitive behaviour (at odds with PEP8 (bottom of linked section) and should be fixed or strongly called out in the documentation. Example:

In [1]: from django.contrib.auth.models import AnonymousUser, AbstractBaseUser

In [2]: a = AnonymousUser()

In [3]: b = AbstractBaseUser()

In [4]: a.is_authenticated
Out[4]: CallableBool(False)

In [5]: b.is_authenticated
Out[5]: CallableBool(True)

In [6]: a.is_authenticated is False
Out[6]: False

In [7]: a.is_authenticated == False
Out[7]: False

In [8]: not a.is_authenticated
Out[8]: True

In [9]: not b.is_authenticated
Out[9]: False

In [10]: b.is_authenticated == False
Out[10]: False

In [11]: b.is_authenticated == True
Out[11]: False

Change History (2)

comment:1 by Mark Tranchant, 8 years ago

Summary: User is_authenticated callable property confusing if used with "is False"User is_authenticated callable property is confusing to check

comment:2 by Mark Tranchant, 8 years ago

Description: modified (diff)
Easy pickings: set
Note: See TracTickets for help on using tickets.
Back to Top