Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I use get_/set_ prefixes in Python method names?

In Python properties are used instead of the Java-style getters, setters. So one rarely sees get... or set.. methods in the public interfaces of classes.

But in cases were a property is not appropriate one might still end up with methods that behave like getters or setters. Now my questions: Should these method names start with get_ / set_? Or is this unpythonic vebosity since it is often obvious what is meant (and one can still use the docstring to clarify non-obvious situations)?

This might be a matter of personal taste, but I would be interested in what the majority thinks about this? What would you prefer as an API user?

Example: Say we have an object representing multiple cities. One might have a method get_city_by_postalcode(postalcode) or one could use the shorter name city_by_postalcode. I tend towards the later.

like image 278
nikow Avatar asked Dec 17 '08 14:12

nikow


3 Answers

I think shorter is better, so I tend to prefer the later. But what's important is to consistent with your project: don't mix the two methods. If you jump into someone else's project, keep what the other developers chose initially.

like image 22
Oli Avatar answered Sep 29 '22 01:09

Oli


You won't ever loose the chance to make your property behave like a getter/setter later by using descriptors. If you want to change a property to be read only you can also replace it with a getter method with the same name as the property and decorate it with @property. So my advice is to avoid getters/setters unless the project you are working on already uses them, because you can always change your mind later and make properties read-only, write-only or whatever without modifying the interface to your class.

like image 65
Vasil Avatar answered Sep 29 '22 03:09

Vasil


If it's usable as a property (one value to get or set, and no other parameters, I usually do:

class Foo(object):

    def _get_x(self):
        pass

    def _set_x(self, value):
        pass

    x = property(_get_x, _set_x)

If the getter/setter is any more complex than that, I would use get_x and set_x:

like image 41
Jeremy Cantrell Avatar answered Sep 29 '22 03:09

Jeremy Cantrell