@@ -1912,3 +1912,58 @@ def test_state_tracking():
19121912 "exit depth 2" ,
19131913 "exit depth 1" ,
19141914 ]
1915+
1916+ # Test multiple context managers in single with statement
1917+ code = """
1918+ class Resource:
1919+ def __init__(self, name, fail_on_exit=False):
1920+ self.name = name
1921+ self.fail_on_exit = fail_on_exit
1922+ self.events = []
1923+
1924+ def __enter__(self):
1925+ self.events.append(f"acquire {self.name}")
1926+ return self
1927+
1928+ def __exit__(self, exc_type, exc_val, exc_tb):
1929+ self.events.append(f"release {self.name}")
1930+ if self.fail_on_exit:
1931+ raise RuntimeError(f"exit error in {self.name}")
1932+ return False
1933+
1934+ def test_multiple_contexts():
1935+ r1 = Resource("r1")
1936+ r2 = Resource("r2", fail_on_exit=True)
1937+ r3 = Resource("r3")
1938+ result = []
1939+
1940+ try:
1941+ with r1 as res1, r2 as res2, r3 as res3:
1942+ result.extend(res1.events)
1943+ result.extend(res2.events)
1944+ result.extend(res3.events)
1945+ result.append("using resources")
1946+ except RuntimeError as e:
1947+ result.append(f"error: {str(e)}")
1948+
1949+ result.extend(r1.events)
1950+ result.extend(r2.events)
1951+ result.extend(r3.events)
1952+ return result
1953+
1954+ result = test_multiple_contexts()
1955+ """
1956+ interpreter .execute (parser .parse (code ))
1957+ assert interpreter .local_env ["result" ] == [
1958+ "acquire r1" ,
1959+ "acquire r2" ,
1960+ "acquire r3" ,
1961+ "using resources" ,
1962+ "error: exit error in r2" ,
1963+ "acquire r1" ,
1964+ "release r1" ,
1965+ "acquire r2" ,
1966+ "release r2" ,
1967+ "acquire r3" ,
1968+ "release r3" ,
1969+ ]
0 commit comments