2006-10-01から1ヶ月間の記事一覧

xmlrpclib

xmlrpclibを使ってみます。 引数でURLを渡してServerProxyのインスタンスを作る インスタンスメソッドのようにドット記法で公開APIにアクセスする 基本的にはこれだけです。簡単ですね。以下ははてなの公開APIを使った例です。 はてなダイアリーキーワード連…

SimpleXMLRPCServer

SimpleXMLRPCServerを使ってみます。 引数で (アドレス, ポート) というタプルを与えてSimpleXMLRPCServerのインスタンスを作る register_instance、register_functionで公開するAPIをインスタンスに登録 serve_foreverでlisten 基本的にはこれだけです。簡…

isinstance

isinstanceを使うと、オブジェクトが任意のクラスのインスタンスかどうかを調べることができます。 def exclam(o): if isinstance(o, str): return o + '!' elif isinstance(o, int): return reduce(lambda x, y: x*y, range(1, o+1), 1) print exclam('hell…

二次元リストを縦に足す

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print l # => [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 転置 print zip(*l) # => [(1, 4, 7), (2, 5, 8), (3, 6, 9)] # 転置した後にタプルになるのが嫌? print map(list, zip(*l)) # => [[1, 4, 7], [2, 5, 8], [3, 6,…

doctestからスクリプトに変換する

doctest.script_from_examplesを使うと引数で与えた文字列中のdoctestをスクリプトに変換することができます。 import doctest print doctest.script_from_examples(''' >>> l = [i for i in range(10) if i%3]) >>> print l [1, 2, 4, 5, 7, 8]''')実行結果…

doctestからunittest.TestSuiteに変換する

doctestをunittest.TestSuiteに変換することでまとめて実行することができます。モジュール中のdoctestをunittest.TestSuiteに変換するためにはdoctest.DocTestSuiteを使います。 # b.py def boo(a, b): """return ', '.join([a]*b) >>> boo('apple', 3) 'ap…

doctest.testfile

doctest.testfileを使うとテキストファイルをドキュメンテーション文字列とみなしてdoctestを行うことができます。 # a.txt >>> [1, 2, 3] [1, 2, 3] >>> ['apple']*3 ['apple', 'apple', 'apple'] >>> f = lambda x: x**2 >>> f(12) 144 >>> import b >>> b…

doctest

doctestを使ってみます。doctestはドキュメンテーション文字列の中から >>> で始まる文字列を探してきて実行します。実行結果が >>> の次の行と一致した場合、テストは成功です。 # a.py import doctest def foo(a, b): '''return a+b >>> foo(10, 1) 12''' …

unittest.FunctionTestCase

unittest.FunctionTestCaseを使うと、関数をTestCaseに変換することができます。 # test.py import unittest def func_test(): '''func_test''' a = 0 for i in range(10): a += i assert a > 30, a suite = unittest.TestSuite() suite.addTest(unittest.Fu…

unittest.TestSuite

いくつかのテストをまとめて実行する場合はunittest.TestSuiteを使います。 # b.py import unittest import random class BarTest(unittest.TestCase): def setUp(self): self.seq = range(random.randint(1, 1000)) def test_len(self): '''len(self.seq) <…

unittest.TestCase

unittestをするためにはunittest.TestCaseのサブクラスを作り、testで始まるメソッドを定義します。メソッドの中でassert*を使い、assert*による例外が発生しなかった場合、テストの結果は成功になります。 参考資料 http://www.python.jp/doc/2.4/lib/node1…

assert

assertを使ってみます。 a = 0 for i in range(5): a += i assert a < 30, a print a a = 0 for i in range(10): a += i assert a < 30, a print a実行結果は以下のようになります。 10 Traceback (most recent call last): File "a.py", line 10, in ? asse…

拡張子を変換する

任意のファイルの拡張子を変換するスクリプトを書いてみました。 # chext.py import os import sys dir = sys.argv[1] dste = '.' + sys.argv[2] srce = ['.'+i for i in sys.argv[3:]] for i in os.listdir(dir): path, ext = os.path.splitext(i) if ext i…

os.walk

os.walkを使うと任意のディレクトリ以下のファイル名を取得することができます。 # walk.py import os import sys for root, dirs, files in os.walk(sys.argv[1]): for f in files: print os.path.join(root, f)ディレクトリ構成が walk.py foo apple.txt b…

os.path.split

os.path.splitを使うとパス名とファイル名を分けることができます。 path = '/usr/bin/python' print os.path.split(path) # => ('/usr/bin', 'python')str.splitを使って同じことをするならこんな感じでしょうか。 path = '/usr/bin/python' print ('/'.joi…

アキュムレータを作ろう

参考資料: 技術野郎の復讐---Revenge of the Nerds--- http://www.shiro.dreamhost.com/scheme/trans/icad-j.html 参考資料の付録にpythonでアキュムレータを生成する関数を書く例が載っているのですが、もうちょっと短く書けないものか、と考えてみました。…

list.sort

sortを使うとリストを並び替えることができます。 l = ['apple', 'orange', 'banana'] # 辞書順に並び替えられる l.sort() print l # => ['apple', 'banana', 'orange'] import random # リストの要素をタプルにすると…… l = [(i, random.randint(1, 100)) f…

zipwithとunzip

zipwithを作ってみました。zipwithは複数のシーケンスを受け取って、それぞれの要素に任意の関数を適用させた結果を要素とするリストを返す関数です。 def zipwith(f, *ls): return map(f, *ls) l1 = range(10) l2 = [i%3 for i in range(10)] print zipwith…

クラス定義を出力してみる

クラス定義を出力してみました。 def put_class(obj): i_vars = list(vars(obj)) methods = [i for i in dir(obj) if callable(getattr(obj, i))] c_vars = list(set(dir(obj)) - set(i_vars) - set(methods)) def put(title, names): s = title names.sort(…

__call__

__call__を定義すると、関数のように()をつけて呼ぶことができるようになります。 class Foo: def __init__(self, name): self.name = name def __call__(self): print self.name f = Foo('apple') f() # => apple組み込み関数callableを使うと呼び出し可能…

wc

簡単なwcを作ってみました。 import sys total_files = 0 total_lines = 0 total_words = 0 total_chars = 0 for f in sys.argv[1:]: try: lines = 0 words = 0 chars = 0 for line in file(f): lines += 1 words += len([w for w in line.split() if w != '…

split

splitを使うと文字列を任意の文字列で分割したリストを作ることができます。 print 'apple, orange, banana'.split(', ') # => ['apple', 'orange', 'banana'] a = 'applejuice, orangejuice, bananajuice' print a.split(', ') # => ['applejuice', 'orange…

比較

インスタンスの比較をしてみます。 class Foo: def __init__(self, name): self.name = name self.len = len(name) def __lt__(self, other): return self.len < other.len def __le__(self, other): return self.len <= other.len def __eq__(self, other):…

リストっぽい何か

__getitem__と__setitem__を定義すると、リストみたいに[]を使って要素を参照したり代入したりできます。 class Foo: def __init__(self, filename): self.file = file(filename, 'r+') def __setitem__(self, index, value): self.file.seek(index) self.fi…

メソッドの中のクラス定義

メソッドの中でもクラスを定義できます。 class Foo: def f(self): class Bar: ans = raw_input('choose 1 or 2: ') if ans == '1': def hello(self): print 'hello, i am one.' elif ans == '2': def hello(self): print 'hello, i am two.' else: def hell…

privateメソッド

クラス定義中の変数の名前の先頭に__をつけると _クラス名__変数名 というように展開されるわけですが、これはメソッドにも当てはまります。 class Foo: def __f(self): print 'i am Foo.__f().' Foo()._Foo__f() # => i am Foo.__f(). Foo().__f() # => Att…

単項演算子の+と-

単項演算子+を使うと__pos__が、-を使うと__neg__が呼ばれます。 class Coin: def __init__(self, head=True): self.head = head def __repr__(self): return self.head and 'head' or 'tail' def __pos__(self): return Coin(self.head) def __neg__(self):…

クラス定義は動的

実行時にクラス定義を決めることができます。 class Foo: ans = raw_input('choose 1 or 2: ') if ans == '1': def hello(self): print 'hello, i am one.' elif ans == '2': def hello(self): print 'hello, i am two.' else: def hello(self): print 'hell…

関数のデフォルト引数

関数のデフォルト引数の値は定義時に評価されて決定されます。関数の中身がデフォルト引数の値を書き換えるようなものだと def f(a, b=[]): b.append(a) print b l = [] f(1, l) # => [1] f(1) # => [1] f(2) # => [1, 2] f(3) # => [1, 2, 3]といった感じで…

importとreload

外部モジュールを使いたいときはimportを使います。 b.pyが class Foo: def func(self): print 'i am Foo.' class Bar: def __init__(self): print 'i am Bar.' def Boo(): print 'i am Boo.'こんな感じになっているものとします。b.pyで定義されているクラ…