Skip to content

Conversation

longhotsummer
Copy link
Contributor

Fixes @list_route and @detail_route so that they don't initialize their methods parameter as a list. In some cases the list gets cleared, and the result is that default parameter is now empty, and may get reused unexpectedly.

Fixes @list_route and @detail_route so that they don't initialize their `methods` parameter as a list. In some cases the list gets cleared, and the result is that default parameter is now empty, and may get reused unexpectedly.
@xordoquy
Copy link
Contributor

xordoquy commented Feb 4, 2015

Good catch though I'd probably rather have them as a tuple to avoid mutability.

"""
Used to mark a method on a ViewSet that should be routed for detail requests.
"""
if methods is None:
methods = ['get']
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a newline here, also let's use the methods = ['get'] if (methods is None) else methods style.

"""
Used to mark a method on a ViewSet that should be routed for detail requests.
"""
methods = ['get'] if methods is None else methods
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor one, this, but I tend to prefer using brackets around the if clause for visual clarity, so I normally do...

['get'] if (methods is None) else methods

@lovelydinosaur
Copy link
Collaborator

I'll take this either with or without tuples. Happy for that to be discussed separately as it's a slightly different issue.

@lovelydinosaur
Copy link
Collaborator

In some cases the list gets cleared

This fix is clearly correct, but I'd be interested to know in what context the list gets mutated?

@longhotsummer
Copy link
Contributor Author

Regarding tuples, I chose not to use them because I didn't want to mess with any code which is trying to change the list (even if it shouldn't be), I didn't want to go down that path right now.

I'm using a pretty standard setup and I just happened to notice that if I used:

@detail_route
def foo(self, request, *args, **kwargs):

it just didn't show up. Digging showed me that the methods param was empty.

@lovelydinosaur lovelydinosaur added this to the 3.0.5 Release milestone Feb 4, 2015
@lovelydinosaur
Copy link
Collaborator

Okay, so just the brackets around the if clause for visual clarity and then I'm happy for this to go in.
Thanks! 😄 ✨

lovelydinosaur added a commit that referenced this pull request Feb 4, 2015
FIX: Don't default to list in method args
@lovelydinosaur lovelydinosaur merged commit 3b00824 into encode:master Feb 4, 2015
@lovelydinosaur
Copy link
Collaborator

Loverly.

@xordoquy
Copy link
Contributor

xordoquy commented Feb 4, 2015

Thanks for tracking this down, this is a very tricky Python side effect.

@longhotsummer
Copy link
Contributor Author

👍 it has caught me a few times

@maryokhin
Copy link
Contributor

it just didn't show up.

It did work for me if used as @detail_route(), but not as @detail_route. I even thought that I didn't understand how decorators work in Python for a while, and that's how it should be.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants