Интересно, должен ли я просто поручиться за использование свойств в Python - PullRequest
11 голосов
/ 26 октября 2010

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

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

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

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 успешно создает новую переменную, когда я случайно хотел использовать свойство, в моем коде появляются незначительные ошибки.Ошибки, которые я нахожу трудно отследить время от времени.Что еще хуже, я однажды использовал одну и ту же опечатку дважды (один раз, когда я устанавливал, и позже один раз, когда получал), так что мой код работал, но гораздо позже, когда другая ветвь кода наконец пыталась получить доступ к этому свойству (правильно)Я получил неправильное значение - но мне потребовалось несколько дней, прежде чем я понял, что мои результаты были немного отклонены.

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

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

Спасибо.

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

Ответы [ 3 ]

3 голосов
/ 26 октября 2010

Вы пробовали инструмент статического анализа? Вот отличная ветка о них.

2 голосов
/ 26 октября 2010

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

0 голосов
/ 26 октября 2010

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

...