У меня есть функция f
, которая возвращает два параметра. После этой функции я использую первый параметр. Мне нужен второй, чтобы склеить вещи вместе с другой функцией g
. Так что мой код будет выглядеть следующим образом:Скрыть вызовы после операции с помощью оператора
a, b = f()
# do stuff with a
g(b)
Это очень повторяющееся, поэтому я полагал, что я мог бы использовать что-то вроде RAII подхода. Но, так как я не знаю, когда объекты будут умирать и моя главная цель состоит в том, чтобы избавиться от повторяющегося кода, я использовал with
заявление:
with F() as a:
# do stuff with a
Вот так. Я в основном создал объект F
вокруг этой функции, поставляя функции __enter__
и __exit__
(и, очевидно, __init__
).
Тем не менее, я все еще задаюсь вопросом, является ли это правильным "Pythonic" способом справиться с этим, поскольку инструкция with
предназначена для обработки исключений. Особенно это функция __exit__
имеет три аргумента, которые я не использую в данный момент.
Редактировать (дальнейшие пояснения): Всякий раз, когда я звоню f()
Мне НУЖНО что-то делать с b
. Неважно, что произошло между ними. Я выразил это как g(b)
. И именно это я скрываю в заявлении. Поэтому программисту не нужно вводить g(b)
снова и снова после каждого звонка f()
, который может стать очень запутанным и запутанным, поскольку #do stuff with a
может затянуться.
* Является ли это * очень повторяющимися? Неясно, в чем проблема, или почему вы считали, что менеджер контекста является лучшим решением. Если вы используете этот код много, сделайте его функцией с параметрами 'a' и' b'. Если бит в середине изменяется, поэтому вы думаете, что не можете его извлечь, а затем добавьте новый параметр, который является функцией для вызова с 'a' перед вызовом' g' (обратите внимание, что функции являются первоклассными в Python). Не могли бы вы дать менее абстрактный пример того, чего вы пытаетесь достичь? Что делает 'g' * do *? – jonrsharpe
Можете ли вы объяснить, как это повторяется в точности? Кроме того, как вы в настоящее время используете 'b' в своем заявлении? Лично я предпочитаю использовать 'with' для вещей, которые выглядят как ресурсы. Другая альтернатива - использование декораторов. – SuperSaiyan
Что такое 'g'? Должна ли она произойти, если исключение будет выброшено? Если это не должно произойти, должна ли произойти какая-то другая очистка? – user2357112