Константы в Python

Давайте немного поговорим о константах в Питоне.

Во первых, давайте дадим понятие что есть константа в контексте компьютерного программирования?

Константой называется — такое значение объекта (величина), которое на протяжении работы программы не меняется.

А вот примеры констант из жизни:

— число Пи всегда равно 3.14159…,
— количество минут в часх всегда равно 60,- масса протона в состоянии покоя всегда равна 930 МэВ,
— код ASCII символа ESC всегда имеет значение равное 0x1B

ну и так далее.

Мы можем даже определять свои константы:

— количество колес на моем автомобиле всегда равно 4,
— день рождения моей жены всегда 17 Апреля,- имя моей младшей дочери — «Светлана».

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

Во многих языках программирования принято писать имена констант в верхнем регистре. Эту традицию программистского мира, мне кажется, заложил язык Си. И люди от «сохи С/С++» свято придерживаются этой традиции.

Писать имена констант в программах большими буквами — это традиция, это религия, это определенный обряд по отношению к константам. Но это не есть правило с точки зрения языка программирования. Нарушение этой традиции не считается ошибкой. Ни один компилятор не выдаст предупреждение об ошибке, если программист напишет имя константы строчными буквами, и наоборот — имя переменной напишет прописными. Но с другой стороны, люди, которые будут читать текст вашей программы, будут недовольны. И правильно, нарушать традиции — это показывать свое дурное воспитание.

Это всё преимущественно касается группы языков С.С++. А что можно сказать относительно Питона, ведь в нём нет такого понятия как «констната»?

В Питоне константой является сам объект, да и то неивсякий!

Питон — это совершенно другой мир программирования, нежди традиционный C/C++/C#, Pascal. Basic,…

Например число 5 в Питоне — это в некотором смысле константа. Говоря языком Питона, число 5 — это неизменяемый объект. На этот объект могут ссылаться две переменные: alpha и beta

alpha = 5
beta = 5

Здесь две переменные ссылаются на одно и то же число, на один т тот же объект. В контексте Python имя объекта — это есть ничто иное как ссылка на объект. В данном случае на объект-число 5.

Сами же объекты могут быть как изменяемые, так и неизменяемые. Неизменяемые объекты — это в некотором роде и есть константы. Число 5 никогда не может стать числом 6.

Иное дело, когда мы запишем:

alpha = 6

после этого alpha будет ссылаться («показывать») уже на другой неизменяемый объект. В Питоне нет встроенного механизма, который бы запрещал изменять «направления» ссылок — это противоречило бы духу Питона. Поэтому ссылки на изменяемые и неизменяемые объекты (то есть, говоря языком Си-шника — ссылки на константы и неконстанты) всегда могут быть изменены в любой момент времени.

Более того, ссылка на объект (в понимании Си-шника — имя переменной или константы) не типирована. Другими словами — если сейчас alpha указывает на число, то после исполнения следующего оператора alpha будет указывать на символьную строку:

alpha = ‘Мама, мама! Что мы будем делать?’

После чего мы можем направить alpha на какой-нибудь еще объект, например на более сложный:

alpha = open(‘my_data.text’, ‘r’)

Сейчас alpha ссылается на файловый объект, который открыт в режиме только для чтения.

Иначе говоря, если в Си мы напишем

#define ALPHA (125)

, а потом где-нибудь в тексте программы попытаемся переопределить ALPHA

ALPHA = 100;

, то компилятор отматерит нас, потому как ALPHA — это константа.

В Питоне же мы имеем полное право присваивать именам ссылки на любые объекты.

Тем не менее, проблема использования констант присутствует в любом языке программирования. Математическую константу ¶ (3.14159) никто не отменял.

Выделять имена констант большими буквами — это признак хорошего тона. По крайней мере это очень существенно в среде C/C++ и некоторых других языков программирования.

Однако, забавно отметить, что Python, очень часто «кладет» на эту Си-шную традицию.

Ohmega = 2.0 * math.pi * freq

Здесь константа «пи» написана строчными буквами. Более того, если вы откроете тексты программ, где используются внешние модули (например, для работы с графикой — Tkinter, wx,…), то увидите, что и тут многие константы также имеют имена, написанные строчными буквами.

Да. Вот такой он — Питон. Здесь всё необычно!

Так вот, ответ на вопрос — писать константы большими или маленьким  буквами зависит от соглашений, которые вы оговорили с коллегами, а не от самого языка программирования.

Advertisements

4 responses to “Константы в Python

  1. В программах на Python я просто следую советам Google, это очень помогает работать над кодом совместно:
    http://habrahabr.ru/post/179271/
    http://habrahabr.ru/post/180509/

    • Спасибо за ссылки!

      Странно, что эти статьи прошли мимо меня, и странно, что и потом я их ни разу случайно не нагулил.

  2. В питоне нет констант.
    Насколько нижеследующий «костыль» имеет право жить?

    давно это было… во 2 — х версиях питона 15 лет назад.
    для решения этого вопроса вот тут http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991
    предлагают такой вариант:
    пишем const.py (я его адаптировал под 3.х)

    # -*- coding: utf-8 -*-
    class _const:
        class ConstError(TypeError): pass
        def __setattr__(self,name,value):
            if name in self.__dict__.keys():
                raise self.ConstError("Не удается привязать const ({0})".format(name))
            self.__dict__[name]=value
    import sys
    sys.modules[__name__]=_const()
    

    И теперь определяем

    import const
    >>> const.eee = 256
    >>> const.eee = 56
    Traceback (most recent call last):
        Debug Probe, prompt 16, line 1
        File "d:\PKM73_DV\Data\PKM\Tests\Python\const.py", line 6, in __setattr__
            raise self.ConstError("Не удается привязать const ({0})".format(name))
    const.ConstError: Не удается привязать const (eee)
    

    При попытке переопределить константу получаю ругалку.

    • Я не углублялся в анализ Вашего кода. (Нет возможности.) Наверно пойдёт и так, как Вы предложили. Сложно, конечно, но что делать!

      Если вспомнить второй Питон, то там даже True и False были не ключевыми словами или константами, а обычными переменными.

      Очень весело, когда можно было сделать так:

      True = 0.5

      или

      True, False = False, True

      Лично я позиционирую Питон как язык для быстрого прототипирования и отладки. Писать на нём что-то коммерческое, которое потом отдавать в пользование, что-то я не очень готов к таким моментам. Особенно там, где речь идет об управлении внешним оборудованием. Там, где нужно быстренько посчитать какую-нибудь задачу — форму магнитного поля, номиналы резисторов для стабилизатора, переходной процесс в электрических цепях… Ну, Вы поняли.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s