Skip to content

Commit 55b8d43

Browse files
committed
fixed async with to call __aenter__ and __aexit__
1 parent c91330c commit 55b8d43

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

custom_components/pyscript/eval.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -631,26 +631,28 @@ async def ast_raise(self, arg):
631631
raise exc from cause
632632
raise exc
633633

634-
async def ast_with(self, arg):
634+
async def ast_with(self, arg, async_attr=""):
635635
"""Execute with statement."""
636636
hit_except = False
637637
ctx_list = []
638638
val = None
639+
enter_attr = f"__{async_attr}enter__"
640+
exit_attr = f"__{async_attr}exit__"
639641
try:
640642
for item in arg.items:
641643
manager = await self.aeval(item.context_expr)
642644
ctx_list.append(
643645
{
644646
"manager": manager,
645-
"enter": type(manager).__enter__,
646-
"exit": type(manager).__exit__,
647+
"enter": getattr(type(manager), enter_attr),
648+
"exit": getattr(type(manager), exit_attr),
647649
"target": item.optional_vars,
648650
}
649651
)
650652
for ctx in ctx_list:
651653
if ctx["target"]:
652654
value = await self.call_func(
653-
ctx["enter"], "__enter__", [ctx["manager"]], {}
655+
ctx["enter"], enter_attr, [ctx["manager"]], {}
654656
)
655657
await self.recurse_assign(ctx["target"], value)
656658
for arg1 in arg.body:
@@ -662,7 +664,7 @@ async def ast_with(self, arg):
662664
exit_ok = True
663665
for ctx in reversed(ctx_list):
664666
ret = await self.call_func(
665-
ctx["exit"], "__exit__", [ctx["manager"], *sys.exc_info()], {}
667+
ctx["exit"], exit_attr, [ctx["manager"], *sys.exc_info()], {}
666668
)
667669
exit_ok = exit_ok and ret
668670
if not exit_ok:
@@ -671,13 +673,13 @@ async def ast_with(self, arg):
671673
if not hit_except:
672674
for ctx in reversed(ctx_list):
673675
await self.call_func(
674-
ctx["exit"], "__exit__", [ctx["manager"], None, None, None], {}
676+
ctx["exit"], exit_attr, [ctx["manager"], None, None, None], {}
675677
)
676678
return val
677679

678680
async def ast_asyncwith(self, arg):
679681
"""Execute async with statement."""
680-
return await self.ast_with(arg)
682+
return await self.ast_with(arg, async_attr="a")
681683

682684
async def ast_pass(self, arg):
683685
"""Execute pass statement."""

0 commit comments

Comments
 (0)