タグ

programmingとpythonに関するpipeheadのブックマーク (318)

  • 2008-05-12

    以下のページを読んだまとめ。リンクページは、例が載っておりよくまとまっているので、ここでは簡単にメソッドの説明をリストするのみとする。 PyMOTW:inspect (http://blog.doughellmann.com/2007/11/pymotw-inspect.html) getmoduleinfo() モジュール名、拡張子、モード、モジュールタイプを取得。 getmembers() オブジェクトの属性のリストを取得。第2引数に述語(predicate)を与えると、フィルタリングして取得することができる。 getdoc() docstringを取得。 getcomments() コメントを取得。 getsource()、getsourcelines() .pyが利用可能なら、ソースコードを取得。 getargspec() 引数名、デフォルト引数の値などを取得。 getclasst

    2008-05-12
  • __slots__ - やっとむでぽん

    クラス定義で、インスタンスに自由に変数を追加できなくするには、__slots__を指定する。使える変数名をリストで渡す。 >>> class Foo(object): ... __slots__ = ['foo'] ... >>> f = Foo() >>> f.foo = 10 >>> f.bar = 20 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Foo' object has no attribute 'bar' >>>不便になるだけなので、こんなことはしないほうがいいと思うが、やりたい場合もあるかも。 この機能はそもそも、メモリ節約のためにある。__slots__の指定がないと、インスタンスごとに変数を保存するためのdictが作られる*1。__slo

    __slots__ - やっとむでぽん
  • 呼び出し元の名前の取得 - プログラミング日記

    常山日記経由でメモ。これはすばらしい。 Chris's Wiki: Finding the name of your caller in Python (http://utcc.utoronto.ca/~cks/space/blog/python/FindingCallersName) import inspect def getcallerinfo(): fr = inspect.currentframe() try: fr = fr.f_back if fr is None: return '<no caller>' fi = inspect.getframeinfo(fr, 0) if fi[2] == '<module>': return '(%s:%d)' % (fi[0], fi[1]) else: return '%s() (%s:%d)' % (fi[2], fi[0],

    呼び出し元の名前の取得 - プログラミング日記
  • 第3回 Python編 | gihyo.jp

    インストール インストールは、LinuxMac OS Xではリスト1の手順で行ってください。Windowsの場合は、http://pyyaml.org/download/pyyaml/にあるWindows installerを使ってください。 リスト1 PyYAMLのインストール $ wget http://pyyaml.org/download/pyyaml/PyYAML-3.05.tar.gz $ tar xzf PyYAML-3.05.tar.gz $ cd PyYAML-3.05/ $ sudo python setup.py install 使い方 PyYAMLの使い方はリスト2のようになります。日語を含む場合は必ずUnicodeにデコードしなければならない点に注意してください。詳細はリファレンスマニュアルを参照してください。 リスト2 PyYAMLの使い方(ex-pyyam

    第3回 Python編 | gihyo.jp
  • クラスの挙動まとめ #2 - 大カフェイン

    前回 クラスの挙動まとめ #1 内容 関数とメソッドの違い 以降は、新形式クラスのみに焦点を当てる。 中には旧形式クラスにも適用される動作もあるけど、無視する。区別が面倒だから。 オブジェクトを比較する際に == と is を使い分けているけど、理由があるので無視するように。 理由は最後のほうのおまけに書いてある。 それぞれの違いは、 Python リファレンスマニュアル - 5.9 比較 (comparison) を参照。 簡単にいうと is 厳密な一致。同一のオブジェクトを指している場合に True 。オーバーロード不可。 == 緩い一致。意味的に同一な場合に True 。オーバーロード可。 なお、このエントリーに書かれている全ての例において、 is が True ならば == も True である == が False ならば is も False である の 2 つが成立している。

    クラスの挙動まとめ #2 - 大カフェイン
    pipehead
    pipehead 2008/04/10
    new.instancemethod()
  • [Python] クラスの挙動まとめ #1 - 大カフェイン

    内容 クラスの基的な挙動、新形式クラス、 type() を使ったクラス生成 対象 ある程度プログラミングの知識がある人。 クラスもオブジェクト Python ではクラスもオブジェクトである。 class Class: """クラスオブジェクトを作成するリテラル Class という変数に "Class という名前のクラス" のオブジェクトを代入している """ pass id(Class) # オブジェクトのアドレス Class.__module__ # オブジェクトの属性にアクセスしている Class.__name__ # クラスオブジェクトのプロパティ __name__ にはクラス名が入っている。ここでは 'Class' Another = Class # 変数だから、代入もできる Another.__name__ # 'Class' obj = Another() isinstanc

    [Python] クラスの挙動まとめ #1 - 大カフェイン
  • functools.partialでのカリー化について考えてみる - @kei10in の日記

    追記 2011-09-18 この記事にあるのはカリー化ではなく部分適用の間違いです。 Pythonでカリー化と部分適用について考えてみる - kk6のメモ帳* カリー化と部分適用の違いと誤用 - Togetter functools.partialというのを教えてもらったのでどういうものか試してみる(`・ω・´) こちらも参考に カリー化 - @kei10in の日記 変数束縛してみる - @kei10in の日記 ぐぐってみるとfunctools.partialというのはPython 2.5からの新機能らしい!!ということがわかった あらためて使ってみる >>> f = lambda x, y: x ** y >>> f(2, 3) 8 >>> from functools import partial >>> g = partial(f, 2) >>> g(3) 8ほぉほぉ parti

    functools.partialでのカリー化について考えてみる - @kei10in の日記
  • よくあるエラー - 西尾泰和のはてなダイアリー

    初心者が出しがちなエラーメッセージに関して、エラーメッセージが英語だからと読まずに飛ばす人が多いかと思って和訳をJythonに書いていたんだけど、どうせならここで公開して他に陥りがちなエラーメッセージの情報を集めた方がいいんじゃないかと思った。 "__add__ nor __radd__ defined for these operands"「その計算の対象にしているオブジェクトには__add__も__radd__も定義されていないよ(足し算が定義されていないよ)」→数が入っているつもりの変数にNoneが入っていたりするとかありがち。数を返すはずの関数がreturnしわすれでNoneを返すとか。 "global name 'x' is not defined"「'x'という名前の変数が(グローバルまで探しに行ったけど)見つからなかったよ!つづり間違ってない?」 "NameError: n

    よくあるエラー - 西尾泰和のはてなダイアリー
  • カリー化 - @kei10in の日記

    変数束縛してみる - @kei10in の日記にコメントもろたヽ(´ー`)ノ >>> f = lambda x, y: x ** y >>> g = f(x=2) >>> g(3) 8 こんな感じのことがしたい!! に対して morchin 2008/03/24 19:10 > こんな感じのことがしたい!! functools.partialを使用すればカリー化できます。 >>> from functools import partial >>> f = lambda x, y: x**y >>> g = partial(f, 2) >>> g(3) 8 というコメントをいただきました.ありがとうございますm(__)m で,カリー化って変数を固定することだったんだ ということを学べた!! ラムダ計算 - Wikipediaは少し読んでみたことあったからカリー化って言う言葉は知ってた. だけ

    カリー化 - @kei10in の日記
    pipehead
    pipehead 2008/03/29
    functools.partial()
  • 変数束縛してみる - @kei10in の日記

    Pythonで変数束縛がしたい!!って思った. 具体的に言うと >>> f = lambda x, y: x ** y >>> g = f(x=2) >>> g(3) 8 こんな感じのことがしたい!! 早速チャレンジ(`・ω・´)シャキーン >>> f = lambda x: x ** y >>> g = f(2) >>> g(3) 8 うーん,これじゃ束縛可能な変数が1つだけだ. しかも,f(2, 3)はできない def f(x=None, y=None): if x is None and y is None: return lambda x, y: x ** y elif x is None: return lambda x: x ** y elif y is None: return lambda y: x ** y else: return x ** y >>> f(2, 3)

    変数束縛してみる - @kei10in の日記
  • 時間城年代記:デコレータで遊ぶ

    ■身も蓋も無い、構文糖衣 構文糖衣(syntax sugar)という言葉は、Lisperあたりは知っていて当然だと思うが、プログラミング言語にあまり詳しくない方はもしかするとご存じないかもしれないので、一応説明しておこう。 そもそも糖衣というのは、薬やお菓子なんかを包んでいる砂糖の殻である(つるつるのプラスチックみたいなアレ。M&Msとか、マーブルチョコレートとかのアレ) 構文糖衣とは、苦い薬を飲みやすく糖衣でくるむように、面倒な構文と等価の構文を書くために用意された簡単な構文である。 デコレータ(修飾子:decorator)は、以下の構文を簡略化するための構文糖衣である。 func = decorator(func) これはそもそも、クラスメソッド、スタティックメソッドなどの登録操作を簡略化するための構文である。 例えば、クラスメソッドは…… class Class: ... def c

  • メソッドの検索順序 - 西尾泰和のはてなダイアリー

    Python2.3以降の新しいクラスは、メソッドの検索順序(MRO, Method Resolution Order)が「C3線形化」というアルゴリズムに変更されている。このアルゴリズムについて解説する。 まずは実例。 >>> class A(object): x = "a" >>> class B(A): pass >>> class C(A): x = "c" >>> class D(object): x = "d" >>> class E(B, C, D): pass >>> e = E() >>> e.x 'c' クラスの検索順序が深さ優先探索ではないことがわかると思う。 C3線形化の特徴はメソッドを探す順番が クラスXがYを継承しているなら必ずXがYより先にくる クラスXがY, Zという順で継承しているならYは必ずZより先に来る 他のクラスのメソッド探索順でXがYより先に来ている

    メソッドの検索順序 - 西尾泰和のはてなダイアリー
  • staticmethodはmethodではなかった - 西尾泰和のはてなダイアリー

    あ…ありのまま 今 起こった事を話すぜ! 『staticmethodはmethodではなかった』 な… 何を言ってるのか わからねーと思うが おれも何でこうなっているのかわからなかった… 冗談はさておき >>> class Foo(object): def method(self, i): print i >>> Foo.method <unbound method Foo.method> >>> class Foo(object): @staticmethod def method(self, i): print i >>> Foo.method <function method at 0x014BE1B0> staticmethodはmethodではなくただのfunctionだった。これは意外。

    staticmethodはmethodではなかった - 西尾泰和のはてなダイアリー
  • 時間城年代記:メタクラスで遊ぶ(3)

    ■__new__の啼く夜は恐ろしい…… つくづく私は、__new__組み込みメソッドとは相性が悪い。 先日、メタクラスの記事の中で、とんでもない誤解コードがあり、コメントで指摘されたので、修正した。 しかしこの際ついでに、__new__メソッドについていろいろ確認しておくことにする。 まず__new__メソッドは『クラスメソッド』扱いである(@classmethonと書くアレ) 即ち、__new__メソッドの第一引数は、『インスタンス』ではなく『クラス』である。 よって、__new__に何も記述しなければ、デフォルトでは以下のような動作が行われている。 def __new__(cls, *args): ins = object.__new__(cls) # インスタンス生成 cls.__init__(ins, *args) # インスタンス初期化 return ins # 戻り値としてイン

  • 角括弧で配列コピー - 西尾泰和のはてなダイアリー

    http://d.hatena.ne.jp/nishiohirokazu/20080219/1203435874 これ、deep copyなのかshallow copyなのかという話。shallowなのでPythonで書けば # perl [ map { &func($foo, $_, $bar) } @{$baz->{quux}} ] は # python [func(foo, x, bar) for x in baz.quux] に相当するわけだな。

    角括弧で配列コピー - 西尾泰和のはてなダイアリー
  • 時間城年代記:メタクラスで遊ぶ(2)

    実は前回は、メタクラス(カスタムメタクラス)で一番力を発揮する__new__メソッドの話と、__call__メソッドの話をわざと省いた。 いや、えらそうなコトを言っておきながら、自分でも少し混乱していたので、こっそりと色々試していたのだ。 で、確認終了したので、ここにまとめる。 (2007.3.2修正しました) ■__new__メソッドについて メタクラスの話に入る前に、確認を兼ねて__new__組み込みメソッドについて。 Pythonでクラスを定義する場合は、__init__メソッドで初期化するのが普通だが、生成過程を制御したい場合には、__new__組み込みメソッドを使用する。 __new__は、__init__と全く同様に引数を設定し、クラスオブジェクトの関数呼び出しの形で使用される。 ただし、二点ほど注意することがある。 一点は「戻り値を設定しない」__init__とは異なり、__

    pipehead
    pipehead 2008/02/27
    __new__() について, メタクラスで Singleton
  • Pythonでdiff - みずぴー日記

    30分プログラム、その252。Pythonでdiffを作ってみる。 diffをちゃんと作ると大変そうだけど、Pythonのdifflibを使えば簡単にできる。 >>> import >>> a = file('foo').readlines() >>> b = file('bar').readlines() >>> difflib.unified_diff(a,b) とするだけで、diffがとれちゃう。便利、便利。 使い方 $ python diff.py ~/tmp/foo ~/tmp/bar --- /Users/mzp/tmp/foo Sat Feb 23 21:51:47 2008 +++ /Users/mzp/tmp/bar Sat Feb 23 21:51:53 2008 @@ -1,3 +1,3 @@ foo -bar +BAR baz ソースコード #! /usr/bin/

    Pythonでdiff - みずぴー日記
    pipehead
    pipehead 2008/02/23
    difflib.unified_diff
  • 時間城年代記:メタクラスで遊ぶ(1)

    今の世の中、オブジェクト指向プログラミングは当たり前だ。 しかし、じゃ「メタクラスは?」と聞かれて即答できる人は、ある程度の勉強家だろう。 なぜか……昨今の「オブジェクト指向プログラミング言語」の主流格であるC++にもJavaにも、メタクラスは存在しないからだ。 無論、Smalltalkerなら「当然」なので、鼻で笑われるだろう。 なんせ、クラスを作るには、メタクラスのインスタンスを作らなければならないからだ。 つまり、メタクラスとは、クラスオブジェクトのクラス、すなわち「クラスのクラス」だ。 正式には、あるオブジェクトがあると、そのクラスのクラスがメタクラス、ということになる。 クラス自身がオブジェクトである言語でなければ、メタクラスが存在するわけない、という意味はご了解できただろうか。 Perl風Smalltalkを標榜するRubyには、メタクラスは当然ある。 では、我らがPython

  • [Python][お勉強] Python入門(43) - import、fromステートメントで文字列を指定する

    メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。 import、fromステートメントではモジュール名を指定するが、 時としてimportするモジュールを動的に決定したい場合があるそうな。 その場合はざっと、 execステートメントを使う__import__関数を使うを使う方法があるとのこと。 execステートメントを使った例 abcという名のモジュールがあったとする。 モジュール名に文字列を指定すると、、、 >>> import "abc" File "<stdin>", line 1 import "abc" ^ SyntaxError: invalid syntax >>> となる。 そこでexecステートメントを使用する。 >>> exec "impo

  • [Python][お勉強] Python入門(35) - インポートの処理

    メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。 ひきつづき「インポートの処理」を見ていく。 インポートの処理は大きく3つのプロセスに分けることができる。 インポート対象のモジュールファイルを探すファイルのコンパイルモジュールを実行し、オブジェクトを生成上記3つのプロセスをひとつづつ見ていく。 1. インポート対象のモジュールファイルを探す モジュールファイルを探すのにはモジュールサーチパスなるものが利用される。 基的にはモジュールサーチパスは自動で設定される。 モジュールサーチパスは4つの要素を持つ。その要素を以下に記す。 トップレベルファイルのホームディレクトリ環境変数PYTHONPATHで指定されたディレクトリ標準ライブラリモジュールのディレクトリ.p