Мое предполагаемое поведение:
>>> x = 0
>>> with (x := 1): print(x)
1
>>> print(x)
0
Однако я получаю ожидаемую ошибку AttributeError: __enter__
. Есть ли простой способ добиться этого или что-то подобное, что позволяет мне компенсировать отсутствие выражения let в стиле Lisp?
P.S. Я знаю, что могу сделать что-то вроде:
class Let(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __enter__(self):
return self
def __exit__(self, *args):
return None
А потом:
>>> with Let(x=1) as let: print(let.x)
Or:
>>> with (let := Let(x=1)): print(let.x)
Но необходимость говорить let.x
, а не просто x
, делает это слишком уродливым!
with
не вводит новую область видимости и не меняет поведение области видимости переменных. - person deceze♦   schedule 08.02.2020with
только для назначения переменной. - person Olvin Roght   schedule 08.02.2020sys.stdout
, но зачем вам временно назначать локальную переменную? - person Alex Hall   schedule 08.02.2020