summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2.py2
-rw-r--r--lib/sqlalchemy/orm/base.py2
-rw-r--r--lib/sqlalchemy/orm/collections.py15
-rw-r--r--lib/sqlalchemy/util/langhelpers.py25
4 files changed, 26 insertions, 18 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
index 4a8df5b5e..cb5cab178 100644
--- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py
+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
@@ -583,7 +583,7 @@ class ExecutemanyMode(FastIntFlag):
(
EXECUTEMANY_VALUES,
EXECUTEMANY_VALUES_PLUS_BATCH,
-) = tuple(ExecutemanyMode)
+) = ExecutemanyMode.__members__.values()
class PGDialect_psycopg2(_PGDialect_common_psycopg):
diff --git a/lib/sqlalchemy/orm/base.py b/lib/sqlalchemy/orm/base.py
index e4a69a352..b46c78799 100644
--- a/lib/sqlalchemy/orm/base.py
+++ b/lib/sqlalchemy/orm/base.py
@@ -188,7 +188,7 @@ class PassiveFlag(FastIntFlag):
PASSIVE_NO_FETCH,
PASSIVE_NO_FETCH_RELATED,
PASSIVE_ONLY_PERSISTENT,
-) = tuple(PassiveFlag)
+) = PassiveFlag.__members__.values()
DEFAULT_MANAGER_ATTR = "_sa_class_manager"
DEFAULT_STATE_ATTR = "_sa_instance_state"
diff --git a/lib/sqlalchemy/orm/collections.py b/lib/sqlalchemy/orm/collections.py
index e3051e268..0c1ccbf10 100644
--- a/lib/sqlalchemy/orm/collections.py
+++ b/lib/sqlalchemy/orm/collections.py
@@ -128,6 +128,7 @@ import weakref
from .base import NO_KEY
from .. import exc as sa_exc
from .. import util
+from ..sql.base import NO_ARG
from ..util.compat import inspect_getfullargspec
from ..util.typing import Protocol
@@ -1222,8 +1223,6 @@ def _dict_decorators() -> Dict[str, Callable[[_FN], _FN]]:
fn._sa_instrumented = True
fn.__doc__ = getattr(dict, fn.__name__).__doc__
- Unspecified = util.symbol("Unspecified")
-
def __setitem__(fn):
def __setitem__(self, key, value, _sa_initiator=None):
if key in self:
@@ -1253,10 +1252,10 @@ def _dict_decorators() -> Dict[str, Callable[[_FN], _FN]]:
return clear
def pop(fn):
- def pop(self, key, default=Unspecified):
+ def pop(self, key, default=NO_ARG):
__before_pop(self)
_to_del = key in self
- if default is Unspecified:
+ if default is NO_ARG:
item = fn(self, key)
else:
item = fn(self, key, default)
@@ -1293,8 +1292,8 @@ def _dict_decorators() -> Dict[str, Callable[[_FN], _FN]]:
return setdefault
def update(fn):
- def update(self, __other=Unspecified, **kw):
- if __other is not Unspecified:
+ def update(self, __other=NO_ARG, **kw):
+ if __other is not NO_ARG:
if hasattr(__other, "keys"):
for key in list(__other):
if key not in self or self[key] is not __other[key]:
@@ -1318,7 +1317,6 @@ def _dict_decorators() -> Dict[str, Callable[[_FN], _FN]]:
l = locals().copy()
l.pop("_tidy")
- l.pop("Unspecified")
return l
@@ -1346,8 +1344,6 @@ def _set_decorators() -> Dict[str, Callable[[_FN], _FN]]:
fn._sa_instrumented = True
fn.__doc__ = getattr(set, fn.__name__).__doc__
- Unspecified = util.symbol("Unspecified")
-
def add(fn):
def add(self, value, _sa_initiator=None):
if value not in self:
@@ -1500,7 +1496,6 @@ def _set_decorators() -> Dict[str, Callable[[_FN], _FN]]:
l = locals().copy()
l.pop("_tidy")
- l.pop("Unspecified")
return l
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index d8d39f56c..051a8c89e 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -1603,11 +1603,6 @@ class symbol(int):
Repeated calls of symbol('name') will all return the same instance.
- In SQLAlchemy 2.0, symbol() is used for the implementation of
- ``_FastIntFlag``, but otherwise should be mostly replaced by
- ``enum.Enum`` and variants.
-
-
"""
name: str
@@ -1632,7 +1627,17 @@ class symbol(int):
if doc:
sym.__doc__ = doc
+ # NOTE: we should ultimately get rid of this global thing,
+ # however, currently it is to support pickling. The best
+ # change would be when we are on py3.11 at a minimum, we
+ # switch to stdlib enum.IntFlag.
cls.symbols[name] = sym
+ else:
+ if canonical and canonical != sym:
+ raise TypeError(
+ f"Can't replace canonical symbol for {name} "
+ f"with new int value {canonical}"
+ )
return sym
def __reduce__(self):
@@ -1665,8 +1670,16 @@ class _IntFlagMeta(type):
setattr(cls, k, sym)
items.append(sym)
+ cls.__members__ = _collections.immutabledict(
+ {sym.name: sym for sym in items}
+ )
+
def __iter__(self) -> Iterator[symbol]:
- return iter(self._items)
+ raise NotImplementedError(
+ "iter not implemented to ensure compatibility with "
+ "Python 3.11 IntFlag. Please use __members__. See "
+ "https://github.com/python/cpython/issues/99304"
+ )
class _FastIntFlag(metaclass=_IntFlagMeta):