Skip to content

Commit 095c0b8

Browse files
authored
fix: avoid possible circular imports in global session (#2115)
1 parent d13abad commit 095c0b8

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

bigframes/core/global_session.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,19 @@
1414

1515
"""Utilities for managing a default, globally available Session object."""
1616

17+
from __future__ import annotations
18+
1719
import threading
1820
import traceback
19-
from typing import Callable, Optional, TypeVar
21+
from typing import Callable, Optional, TYPE_CHECKING, TypeVar
2022
import warnings
2123

2224
import google.auth.exceptions
2325

24-
import bigframes._config
2526
import bigframes.exceptions as bfe
26-
import bigframes.session
27+
28+
if TYPE_CHECKING:
29+
import bigframes.session
2730

2831
_global_session: Optional[bigframes.session.Session] = None
2932
_global_session_lock = threading.Lock()
@@ -56,6 +59,9 @@ def close_session() -> None:
5659
Returns:
5760
None
5861
"""
62+
# Avoid troubles with circular imports.
63+
import bigframes._config
64+
5965
global _global_session, _global_session_lock, _global_session_state
6066

6167
if bigframes._config.options.is_bigquery_thread_local:
@@ -88,6 +94,10 @@ def get_global_session():
8894
8995
Creates the global session if it does not exist.
9096
"""
97+
# Avoid troubles with circular imports.
98+
import bigframes._config
99+
import bigframes.session
100+
91101
global _global_session, _global_session_lock, _global_session_state
92102

93103
if bigframes._config.options.is_bigquery_thread_local:

third_party/bigframes_vendored/pandas/_config/config.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
import contextlib
33
import operator
44

5-
import bigframes
6-
75

86
class option_context(contextlib.ContextDecorator):
97
"""
@@ -35,8 +33,11 @@ def __init__(self, *args) -> None:
3533
self.ops = list(zip(args[::2], args[1::2]))
3634

3735
def __enter__(self) -> None:
36+
# Avoid problems with circular imports.
37+
import bigframes._config
38+
3839
self.undo = [
39-
(pat, operator.attrgetter(pat)(bigframes.options))
40+
(pat, operator.attrgetter(pat)(bigframes._config.options))
4041
for pat, _ in self.ops
4142
# Don't try to undo changes to bigquery options. We're starting and
4243
# closing a new thread-local session if those are set.
@@ -47,25 +48,32 @@ def __enter__(self) -> None:
4748
self._set_option(pat, val)
4849

4950
def __exit__(self, *args) -> None:
51+
# Avoid problems with circular imports.
52+
import bigframes._config
53+
import bigframes.core.global_session
54+
5055
if self.undo:
5156
for pat, val in self.undo:
5257
self._set_option(pat, val)
5358

5459
# TODO(tswast): What to do if someone nests several context managers
5560
# with separate "bigquery" options? We might need a "stack" of
5661
# sessions if we allow that.
57-
if bigframes.options.is_bigquery_thread_local:
58-
bigframes.close_session()
62+
if bigframes._config.options.is_bigquery_thread_local:
63+
bigframes.core.global_session.close_session()
5964

6065
# Reset bigquery_options so that we're no longer thread-local.
61-
bigframes.options._local.bigquery_options = None
66+
bigframes._config.options._local.bigquery_options = None
6267

6368
def _set_option(self, pat, val):
69+
# Avoid problems with circular imports.
70+
import bigframes._config
71+
6472
root, attr = pat.rsplit(".", 1)
6573

6674
# We are now using a thread-specific session.
6775
if root == "bigquery":
68-
bigframes.options._init_bigquery_thread_local()
76+
bigframes._config.options._init_bigquery_thread_local()
6977

70-
parent = operator.attrgetter(root)(bigframes.options)
78+
parent = operator.attrgetter(root)(bigframes._config.options)
7179
setattr(parent, attr, val)

0 commit comments

Comments
 (0)