文字列を1文字ずつ処理する

Pythonクックブックを読みながら、IronPythonで色々お試し。

import clr
from System import Convert,IConvertible

for c in 'Hello':
    print c.GetType(), ord(c)

"""
System.String 72
System.String 101
System.String 108
System.String 108
System.String 111
"""

for c in 'Hello'.Chars: 
    print c.GetType(), ord(c), Convert.ToInt16(c), IConvertible.ToInt16(c, None)

"""
System.Char 72 72 72
System.Char 101 101 101
System.Char 108 108 108
System.Char 108 108 108
System.Char 111 111 111
"""

Pythonでは「文字」という型は存在せず、文字は長さ1の文字列として表現されます。なので、もし、.NETライブラリでchar型を要求される場合は、Charsプロパティを使うと良いです。あと、落とし穴ですがPythonは基本的に型を意識しないため、.NETにおける明示的なインタフェースなどを使う場合、そのまま呼び出せず、上記サンプルにあるように、

インタフェース.メソッド(インスタンス,引数)

と書かなければなりません。ただ、将来的には変更されるかもしれません。


ところで、CPythonとIronPythonで異なる文字列型を持っていますが、それについては上手く整合性を取っていますが、CPythonのunicode文字列(u'文字列')は上手く扱えてない気がします。弄ってて首をかしげる場面が何度か・・・