repr()、str()、eval() のお話

Biopython Tutorial and Cookbookの和訳を行ってる最中。

>>> from Bio import SeqIO
>>> for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
...     print(repr(seq_record.seq))

Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA())
・
・
・
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', IUPACAmbiguousDNA())

FASTAファイルを読んで配列を出力する際にreprを使っている。 ただの.seqだと

>>> for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
...     print(seq_record.seq)

CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC
・
・
・
CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC

配列だけが返される。


つまり、reprのおかげでSeqオブジェクトが保たれている。

そもそもreprをよく知らなかったので、調べてみた。
ちょっと調べた感じだとstr()とそんな変わらない??

オブジェクトの印字可能な表現を含む文字列を返します。これは型変換で得られる (逆クオートの) 値と同じです。通常の関数としてこの操作にアクセスできるとたまに便利です。この関数は多くの型について、 eval() に渡されたときに同じ値を持つようなオブジェクトを表す文字列を生成しようとします。そうでない場合は、角括弧に囲まれたオブジェクトの型の名前と追加の情報 (大抵の場合はオブジェクトの名前とアドレスを含みます) を返します。クラスは、 repr() メソッドを定義することで、この関数によりそのクラスのインスタンスが返すものを制御することができます。

引用:2. 組み込み関数 — Python 2.7.14 ドキュメント

x = 'foo'
In [1]: x = 'foo'
In [2]: repr(x)
Out[2]: "'foo'"

In [3]: str(x)
Out[3]: 'foo'

引用:
[https://stackoverflow.com/questions/7784148/understanding-repr-function-in-python:title]

違った。eval()と一緒にご紹介。

  • eval(x)
    与えられた引数がPython 式 (技術的にいうと、条件のリスト) として解析され評価される。実行したいコマンドを文字列にして引数に与える。
    下の場合だと、fooインタプリタで実行した返り値を返す。fooなんて変数は定義されてないからエラーになる。

    >>> eval('foo')
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
       eval('foo')
      File "<string>", line 1, in <module>
    NameError: name 'foo' is not defined
    

    'foo'インタプリタで実行した値がほしい場合は

    >>> eval("'foo'")
    'foo'
    

    とすればよい。

  • repr(x)
    xのマジックメソッド__repr__を呼び出す。 基本的にeval()の逆version。インタプリタで実行したときに印字可能な表現を返すような値を返すような値を文字列にしたもの。文字列にしたものである。
    python >>> x = 'foo' >>> repr(x) "'foo'" そしたらこんな感じでダブルクオートで囲まれることになる。

  • str(x)
    xのマジックメソッド__str__を呼び出す。

    >>> x = 'foo'
    >>> str(x)
    'foo'
    


Biopythonの例ではseq_record.seq.__repr__Seqオブジェクトを返すようになっているってだけぽい。

参考

Understanding repr( ) function in Python - Stack Overflow