

何が問題なのかわかっていないので適切な質問ができないのですが，以下のようなwith文を使って書かれたコードの構造がわかりません．  
以下は疑似コードです．

[code]

    import gzip
    import codecs
    
    with codecs.getreader('utf-8')(gzip.open(u'inputfile.gz', 'r')) as f:
        for line in f:
            some processes
    
[/code]

（この例は[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の問題20を念頭に置いています）  
このwith文において，gzip.open()はcodecs.getreader()とどういう関係にあるのでしょうか？  
つまり，gzip.open()はcodecsのメソッドではないし，.getreaderのスコープにも入っていませんので，おそらくwith文の要素のひとつになっているのだと思うのですが，どういう要素かわかりません．with文はこのように並列的にいくつも要素（項？）をとることができるのだとして，それらはどういう関係にあるのでしょうか？


CC BY-SA 4.0
2018-06-10T13:23:13.417
44667
2018-06-10T14:34:24.587
23018
question
python
pythonのwith文がとることのできる要素について


こういうことではないでしょうか。

[code]

    import gzip
    import codecs
    
    myreader =  codecs.getreader('utf-8')
    with myreader(gzip.open(u'inputfile.gz', 'r')) as f:
        for line in f:
            some processes
    
[/code]


CC BY-SA 4.0
2018-06-10T14:15:09.570
44668
2018-06-10T14:15:09.570
4010
44667
answer


例外を気にしなければ

[code]

    f = codecs.getreader('utf-8')(gzip.open(u'inputfile.gz', 'r'))
    for line in f:
        some processes
    f.close()
    
[/code]

と書けるので、`with`は関係ありません。

[Pythonのドキュメント](https://docs.python.org/ja/2.7/library/codecs.html#codecs.getreader)を参照すると

> codecs.getreader(encoding) 与えられたエンコーディングに対する codec を検索し、StreamReader
> クラスまたはファクトリ関数を返します。

とあるので、`codecs.getreader`の返す値は、そのまま関数として呼び出すことができます。したがって最初の行は、更に

[code]

    factory = codecs.getreader('utf-8')
    gzippeddata = gzip.open(u'inputfile.gz', 'r')
    f = factory(gzippeddata)
    
[/code]

と書けます。つまり`codecs.getreader('utf-8')(gzip.open(u'inputfile.gz',
'r'))`は連続関数呼び出しなのです。

一般的に`f()()`のような構文は、連続で関数を呼び出していることが多いです。


CC BY-SA 4.0
2018-06-10T14:34:24.587
44670
2018-06-10T14:34:24.587
3605
44667
answer