Интересно, нужно ли мне просто поручать использование свойств в python

Я пытаюсь использовать свойства, а не конкретные сеттеры и геттеры в моем приложении. Они кажутся более pythonic и, как правило, делают мой код более удобочитаемым.

Более читаемый, за исключением одного вопроса: Typos.

рассмотрим следующий простой пример (обратите внимание, что мои свойства действительно выполняют некоторую обработку, даже если примеры здесь просто устанавливают или возвращают простую переменную)

class GotNoClass(object):

    def __init__(self):
        object.__init__(self)
        self.__a = None

    def __set_a(self, a):
        self.__a = a

    def __get_a(self):
        return self.__a

    paramName = property(__get_a, __set_a)


if __name__ == "__main__":
    classy = GotNoClass()

    classy.paramName = 100
    print classy.paramName

    classy.paranName = 200
    print classy.paramName

    #oops! Typo above! as seen by this line:
    print classy.paranName

Результат, как увидит мало кто читает, есть:

100
100
200

К сожалению. Должно быть, за исключением того, что я сделал опечатку - я написал paranName (два n) вместо paramName.

Это легко отлаживается на этом простом примере, но это причиняет мне боль в моем более крупном проекте. Поскольку python с радостью создает новую переменную, когда я случайно использовал свойство, я получаю тонкие ошибки в своем коде. Ошибки, которые я нахожу трудно отслеживать время от времени. Хуже того, я когда-то дважды использовал одну и ту же опечатку (однажды, когда я устанавливал, а позже, когда я получал), поэтому мой код, похоже, работал, но намного позже, когда другая ветка кода наконец попыталась получить доступ к этому свойству (правильно) Я получил неправильное значение - но мне потребовалось несколько дней, прежде чем я понял, что мои результаты были немного отброшены.

Теперь, когда я знаю, что это проблема, я трачу больше времени на то, чтобы внимательно прочитать мой код, но в идеале у меня был бы способ поймать эту ситуацию автоматически - если я пропустил только один, я могу ввести ошибку, которая не показывает пока не пройдет честное время...

Так что я задаюсь вопросом, нужно ли мне просто переключиться на использование старых старых сеттеров и геттеров? Или есть какой-то аккуратный способ избежать этой ситуации? Люди просто полагаются на себя, чтобы поймать эти ошибки вручную? Увы, я не профессиональный программист, просто кто-то пытается получить что-то на работе, и я действительно не знаю, как лучше подойти к этому.

Спасибо.

P.S. Я понимаю, что это тоже одно из преимуществ Python, и я не жалуюсь на это. Просто интересно, буду ли я лучше использовать явные сеттеры и геттеры.

Ответ 2

В зависимости от того, как работает ваш код, вы можете попробовать slots. Вы получите исключение AttributeError, созданное при попытке присвоить то, что не в слотах, что сделает эту опечатку более очевидной.

Ответ 3

Бывают случаи, когда проверка времени компиляции действительно экономит время. Кажется, вы определили один такой случай. Случайно, а не осторожный выбор, я использую геттеры и сеттеры, и я счастлив; -)