Что делает Python 3.2 "с / как"? - PullRequest
7 голосов
/ 25 апреля 2011

Я изучаю 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 ]

10 голосов
/ 25 апреля 2011

with так не работает.

Он предназначен для автоматической очистки объекта в конце блока, например, вместо

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

Вы можете сделать

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

и закрытие происходит автоматически.

См. PEP 343 - подробности в заявлении «с» и Что нового в Python 2.5 - PEP 343 еще несколько примеров того, как вы можете его использовать.

6 голосов
/ 25 апреля 2011

Оператор with не предназначен для того, чтобы делать то, что вы ожидаете.Он использует «протокол менеджера контекста» и, как таковой, ожидает, что ему будет передан менеджер контекста .

Чтобы создать псевдоним, просто назначьте его новой переменной:

import pprint

pow = 1, 2, 3

pp = pprint.pprint
pp(pow)
2 голосов
/ 25 апреля 2011

Вы используете его, ожидая, что оно псевдоним существующего имени, но в Python with ожидает, что будет передан менеджер контекста . pprint.pprint не является менеджером контекста.

0 голосов
/ 25 апреля 2011

Псевдоним - не то, для чего with.Что вы, вероятно, хотите, это:

from pprint import pprint

pow = 1, 2, 3
pprint(pow)
...