9

私はPythonを学んでいて、with **** as ****:ステートメントを試しています。C# と同じように機能すると思いusing(****) {ますが、古い例に従っているのではないかと思います。

これは私のコードです:

# -*- coding: iso-8859-1 -*-

import pprint

pow = 1, 2, 3

with pprint.pprint as pprint:
    pprint(pow)

ここで起こっていることはpprint、私の小さなクロージャーが関数のエイリアスであると仮定していpprint.pprintます。ただし、奇妙なエラーが発生します。

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    with pprint.pprint as pprint:
AttributeError: __exit__

だから今、私は以前と同じように古いバージョンの Python の構文を使用していると考えています ( print "Hello")

コードが期待どおりに機能しないのはなぜですか?

4

4 に答える 4

14

withそのようには機能しません。

ブロックの最後にあるオブジェクトを自動的にクリーンアップするように設計されています。

file = open('foo.txt')
# do stuff
close(file)

できるよ

with open('foo.txt') as file:
    # do stuff

クローズは自動的に行われます。

詳細についてはPEP 343 -- The "with" Statementを参照してください。使用方法の例についてはWhat's New in Python 2.5 - PEP 343を参照してください。

于 2011-04-24T22:11:52.517 に答える
8

このwithステートメントは、あなたが期待することを意図したものではありません。「コンテキストマネージャープロトコル」を使用するため、コンテキストマネージャーが渡されることを期待しています。

エイリアスを作成するには、それを新しい変数に割り当てます。

import pprint

pow = 1, 2, 3

pp = pprint.pprint
pp(pow)
于 2011-04-24T22:12:41.347 に答える
3

既存の名前のエイリアスを期待して使用していますが、Python ではwithcontext manager が渡されることを期待していますpprint.pprintコンテキストマネージャではありません。

于 2011-04-24T22:08:56.623 に答える
1

エイリアシングはwith目的ではありません。おそらくあなたが望むのはこれです:

from pprint import pprint

pow = 1, 2, 3
pprint(pow)
于 2011-04-24T22:22:18.890 に答える