Hatena::ブログ(Diary)

Pashango’s Blog このページをアンテナに追加 RSSフィード

2009-06-21

なぜPythonには"標準"で定数を定義できないのか?

結論から言うと、Pythonになぜ"標準"で定数がないのかは「わかりません」。

答えを求めていた人には申し訳ない。


Pythonには知っての通り、定数を定義できません。

(独自でconstクラスを実装すれば定数らしき事はできます)

定数の実装が難しいとは考えにくいので、「Gutioは意図的に定数を排除した」と考える方が自然だと思います。


ちなみに、他のスクリプト言語での定数の扱いは以下のとおりです。


perl...use constantで定義可能
PHP...define()で定義可能
JavaScript...constで定義可能
Ruby...全大文字の変数は初期化以外の代入には警告を出す

ほとんどの言語では、何らかの形で定数をサポートしています。

Rubyは、定数の代入に対して警告を出すのみなので、定数と呼ぶかは若干微妙ですが・・・

しかし、ここまで定数を無視する言語は珍しいと思います、逆にすがすがしいですね。


Pythonでは「なぜ標準で定数が無いのか」という問いに対して、納得できる解答に出会った事がありません。

  • タプルを使えばいいじゃん

 (タプルは定数の代わりにはなりません)

  • Rubyだって参照先から代入されてたら警告出ないし
  • True,Falseすら定数でないのに、何をいまさら・・・
  • 定数なんて飾りです、偉い人には(略)

個人的にはRubyみたいに、定数を代入すると警告を出すくらいが調度いい塩梅だと思います。

(参照先からの代入には無力だけど・・)

Pythonでも定数にできる値は、「数値型」、「文字列型」、「タプル」のみと、変更不可オブジェクト限定にすれば、定数も結構うまく処理できると思いますけどね。

なぜ定数が必要?なぜ定数が必要? 2009/06/22 17:46 モジュールレベルの変数(=Singleton)でいいじゃん。充分用足りるでしょう。

というのが解答です。嘘だと思ったらcomp.lang.pythonに投稿してごらん。

pashango_ppashango_p 2009/06/22 23:05 書き込みありがとうございます。
モジュールレベルの変数とは、

#const.py
CONST_VALUE = "const value"

#sample.py
import const
print const.CONST_VALUE
const.CONST_VALUE = "not const value"
print const.CONST_VALUE

の事ですか?
やはり、うっかり上書きを防ぐためにも、定数はあった方がよいかと・・・・

なぜ定数が必要?なぜ定数が必要? 2009/06/23 10:12 「モジュールレベルの変数」については上記の通りです。クラス変数も同様に、定数定義的な用途でよく使われます。

「うっかり上書きを防ぐためにも、定数はあった方がよい」ぐらいじゃ説得力ないな。「そんなものなくたって充分安全なプログラムが作成できるる。巷にあるPythonアプリケーション/ライブラリがその証明」って言われたらそれまで。

そもそも True="foo" などということが可能な動的言語にとっての安全性とは何か?から考えないと。

pashango_ppashango_p 2009/06/23 13:41 コメントありがとうございます。
回りは「Pythonってなに?」なので、話が通じる人と話せるのは久しぶりです。

>「そんなものなくたって・・・」
それを言ってしまうと、「オブジェクト指向がなくたって」「Rubyが」「Pythonが」となってしまうので・・・汗

あとTrue,Falseの話ですが、厳密に言えばTrue、Falseは予約されていない定数です。
「True="foo"」はTrueという定数を変えているのではなく、Trueという同名変数を定義しているにすぎません。
言葉だけだと分かり辛いので、以下コードです。

>>> a = True
>>> True = "foo"
>>> 1 == 1
True
>>> a
True
>>> True
'foo'
>>> del True
>>> True
True
>>> del True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'True' is not defined

>そもそも True="foo" などということが可能な動的言語にとっての安全性とは何か?

Pythonにおいては、安全性<柔軟性という哲学が優勢であるということでしょう。
ですがTrue="foo"とできる事は、私は失敗だと思います。
定数の変更ではなく同名変数の定義のため、スコープによってTrueは様々な値を返します。
こんな中途半端な柔軟性は、かえって混乱を生むだけです。
実際、Python3ではTrue,Falseは定数ですしね。
仮にPythonに定数が実装されても、何らかの手段で定数を変更する手段を用意するでしょう。
ですから定数=柔軟性の否定という事にはならないと思うのです。

うう、こんなに強弁すると「定数必須派」みたいだけど、本当は「定数あったらいいな派」です。

なぜ定数が必要?なぜ定数が必要? 2009/06/24 10:23 True="foo"は例が不適切で話をややこしくするだけでした。ごめんなさい。

True/FalseはPython 2.2で導入されたものです。2.xでTrue/Falseが予約語ではなく単なる名前となっている「中途半端さ」の理由は、それ以前のバージョンとの互換性維持です。もちろん 3.x で True/False は予約語になっています。

話を元に戻しましょう。

定数定義のための特別な仕組みってPythonに必要でしょうか?私はその必要を感じません。具体的にどんなものを想像されています?

「あったほうが便利な機能」をどんどん付け加える言語もありますが、Pythonは極力余計なものを付け加えないでシンプルさ保ち続ける言語です。

他の言語だと「あって当然」のブール型オブジェクトでさえ、実はさんざん議論してやっと2.2で導入されることになったのですよ。

http://www.python.jp/Zope/PyLog/1018439539/index_html

pashango_ppashango_p 2009/06/24 13:53 コメントありがとうございます。
個人的な疑問に、こんなに付き合って頂き感謝です。

>「あったほうが便利な機能」をどんどん付け加える言語もありますが、
>Pythonは極力余計なものを付け加えないでシンプルさ保ち続ける言語です。

全くその通りだと思います。
Pythonの1番の特徴は「シンプル」で「習得が容易」だと思います。
私がPythonとRubyでPythonを選んだのもこの理由からです。

>具体的にどんなものを想像されています?

個人的に一番よいと思うのはRubyの定数の扱いですね。
RubyではUpperCaseの変数は定数として扱い、代入しようとすると警告を出します。
警告だけで代入はできますので、定数というかは微妙ですが。

>>> CONST_VALUE = "const value"
>>> CONST_VALUE = "not const value"
warning: already initalized constant CONST_VALUE
=>"not const value"

"const"などの予約語を追加せずシンプルさを保ったまま、必要十分な定数の機能を実現しています。
Pythonの哲学にもよく馴染んでいると思います。

>定数定義のための特別な仕組みってPythonに必要でしょうか?

「定数定義のために特記法が必要か?」という問いでしたら「NO」です。
"const"キーワードを望む声がありますが、私は反対です。
ただし、Ruby式の定数であれば歓迎します。

言葉足らずで伝わらなかった事もあったでしょうか、これが自分の意見です。
総合的にPythonはRubyより好きですが、Rubyで一番うらやましいのは定数の扱いだったりします。

pashango_ppashango_p 2009/06/24 14:22 追記:
実際の話、自分がPythonでコーディングをしていて、定数を「うっかり上書き」してしまったことはありません。
自分の過去コードをりファクタリングしててもUpperCase変数は「変えてほしくないんだな」と思うし、他人が作ったモジュールの変数をむやみに書き換えることはまずありません。

でも自分が提供したモジュールを、初心者がむやみに書き換えやしないかと心配で夜も眠れません。
でも、こういう人って(プログラマには)結構多いと思います。

結局、「定数があるべき」という人は、こんな心配性な人なんだと思います:-)

pashango_qpashango_q 2010/09/23 03:14 pashango_pの一連の書き込みは「僕はいらないと思うからいらない」を繰り返すだけの低脳コメントにしか読めなくてうざい…。せっかくブログ主がおもしろい話題を拾い上げてるのに。

あれ?あれ? 2011/06/17 16:30 >pashango_pの一連の書き込みは「僕はいらないと思うからいらない」を繰り返すだけの低脳コメントにしか読めなくてうざい…。

pashango_pはブログ主の名前では?

as_a_mixas_a_mix 2011/07/28 20:55 Python定数でぐぐったら出てきました。Pythonって定数無いんですね。なくても困らないけどなんとなく定数使いたいなーという気持ちはあります。Ruby式に賛成!

suppinsuppin 2013/11/04 15:39 じゃあ、なぜ privateメソッド が実装されてるのか?
変数間違って使うことなんかねーよ、それくらいアナログで回避しろっていうのが設計者の主張なら
じゃあ、関数も間違って使うことなんかねーんだから private なメソッドもなしにしてしまえばいいだろうに。
python は時々実装に中途半端さが見られるな

hogehogehogehoge 2014/04/11 14:30 >「あったほうが便利な機能」をどんどん付け加える言語もありますが、Pythonは極力余計なものを付け加えないでシンプルさ保ち続ける言語です。

これは納得する。が、最近はwithとか出てきてシンタックスが微妙に増えてるっていう。もうシンタックス増えないで欲しいとすら思ってる次第...

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/pashango_p/20090621/1245601485