作者: 機械伯爵
日時: 2007/10/21(12:17)
 機械す。

 まぁ、北斗ネタはおいといて。

<キーワード引数>
> まあそうかもしれないっすけど、キーワード引数なんかはずいぶんと前から
> 望まれているけど、いまだに実装されていないわけで。
> #まあ技術的なものでないところでの問題が主なんでしょうが

 キーワード引数は便利だと思うけど、コードが見難くなるとか
いう理由があるのかなぁ?(そうは思わないけど)
 
<リターン>
> 最後に評価された式の値がサブルーチン(メソッド/関数)の戻り値になるのは
> 多分Perl由来です。そのPerlはどこから持ってきたのか、はたまたPerl起源
> なのかまでは知りませんが。

 あ、Perlもそうだっけ?(完全に忘れてるな……)

 でも逆の議論もあって、例えばPythonで手続きっぽい関数を書く時は、
PythonではNoneを返すことで外にいらん値を出すのを抑制してるのだけ
ど、Rubyでそうすると、逆にreturn null(だっけ?)と書かなければ
ならないわけで。

 何でも値を返さなきゃならない、というなら、

> > <輸入/れぎゅらーえくすぷれっしょん>

 Pythonに正規表現リテラルが無いのは、多分Pythonの哲学でしょうね。
 しかも、旧式のregex モジュールが組み込みだったのに、reに分離したのは、
一つは、正規表現の更新に対して、本体のアップデートの対応でなく、できる
かぎりモジュールレベルでの変更で対応したい、ということなのだろうと思い
ます。
 加えて、やろうと思えば、モジュールの拡張なんて、Pythonを或る程度弄っ
た人間には簡単にできますしね(効率はともかく)

<指自>
> >  ちなみに、メソッドの第一引数にselfを書かなければならないのが、
> > 面倒、という意味でしょうね(自分自身を参照するならthisつけるの
> > で同じわけだし……)
> 
> そんなに面倒ですかねえ?
> そんなに面倒ならエディタに自動で入れさせれば(笑)

 あまりクローズアップされないけど、PythonとRubyの関数/メソッドの
扱いは、完全に別物です。

 Rubyでは関数は全てメソッドで、メソッドは要するにメッセージです。

 メッセージ、というのは要するに、オペレータ(演算子)扱いですよね。

 これに対し、Pythonは、関数もメソッドも全て「オブジェクト」です。

※私の知る限り、Schemeくらいしか類似のシステムは無いですね。

 これは、Pythonとしてのポリシーとしては、演算子をむやみに増やさないという
ところも関係しているかもしれません。

 そして、関数もメソッドも基本的には関数オブジェクトなのですが、独立した
関数と、クラス/インスタンスに属する関数、という差です。

※スタティックメソッドという、クラスに「入ってるだけ」のただの関数も
 ありますけど……

 で、メソッドの有利な点はクラス/インスタンス名前空間を参照できることで、
その有利な点を「明示的に」表してるのが、セルフポインタであるメソッド
第一引数、通例selfと名付けられるモノなのですわ。

 で、まぁ、ご存知の方はご存知の通り、メソッドの呼び出しには二通りあります。

class A:
  def mes0(self, n):
    self. n = n
    return self

 上のようなクラスがあり、a = A()でインスタンスを作ったとすると、メソッド
mes0を呼び出す方法としては……

a.mes(10)

 という方法と、

A.mes(a, 10)

 という方法が両方できます(というか、後者の略記法が前者と思った方がいい
かも……)

 方法論として正しいとか、便利かは別として、多分必要以上に「仕組みがわかり
やすい」のがPythonの特徴だったりします(前回使った「情報公開言語」ってのが
結構ハマるかな?)
 
> >  global.value ?
> 
> まあ雰囲気としてはそれですが、globalってのは名前がよくないですね。
> 
> class ほげ(Object):
>   foo = Math.random()
>   def ふが():
>      bar = foo + 1 #←ここで見ているfooは? あ、class の selfか(自爆)
> 
> っていう事態を想定して言ってましたので。
> 
> これは自分の外側にあるという意味ではよりglobalに近くはありますが、
> globalではないですよね。

 まぁPythonでは、レキシカルスコープが装備されて以降、

import random

foo = random.random()

class Hoge:

  foo = random.random()

  def fuga0(self):
    self.bar = foo + 1 # クラス変数かグローバル変数

  def fuga1(self):
    global foo
    self.bar = foo + 1 # グローバル変数を明示

  def fuga2(self):
    global foo
    self.bar = Hoge.foo + 1 # クラス変数を明示

 ってな感じで使い分けてます。

 あんまり、簡単ではないかもしれません。

 /機械伯爵/