_py_util.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # engine/_py_util.py
  2. # Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
  3. # <see AUTHORS file>
  4. #
  5. # This module is part of SQLAlchemy and is released under
  6. # the MIT License: https://www.opensource.org/licenses/mit-license.php
  7. from __future__ import annotations
  8. import typing
  9. from typing import Any
  10. from typing import Mapping
  11. from typing import Optional
  12. from typing import Tuple
  13. from .. import exc
  14. if typing.TYPE_CHECKING:
  15. from .interfaces import _CoreAnyExecuteParams
  16. from .interfaces import _CoreMultiExecuteParams
  17. from .interfaces import _DBAPIAnyExecuteParams
  18. from .interfaces import _DBAPIMultiExecuteParams
  19. _no_tuple: Tuple[Any, ...] = ()
  20. def _distill_params_20(
  21. params: Optional[_CoreAnyExecuteParams],
  22. ) -> _CoreMultiExecuteParams:
  23. if params is None:
  24. return _no_tuple
  25. # Assume list is more likely than tuple
  26. elif isinstance(params, list) or isinstance(params, tuple):
  27. # collections_abc.MutableSequence): # avoid abc.__instancecheck__
  28. if params and not isinstance(params[0], Mapping):
  29. raise exc.ArgumentError(
  30. "List argument must consist only of dictionaries"
  31. )
  32. return params
  33. elif isinstance(params, dict) or isinstance(
  34. # only do immutabledict or abc.__instancecheck__ for Mapping after
  35. # we've checked for plain dictionaries and would otherwise raise
  36. params,
  37. Mapping,
  38. ):
  39. return [params]
  40. else:
  41. raise exc.ArgumentError("mapping or list expected for parameters")
  42. def _distill_raw_params(
  43. params: Optional[_DBAPIAnyExecuteParams],
  44. ) -> _DBAPIMultiExecuteParams:
  45. if params is None:
  46. return _no_tuple
  47. elif isinstance(params, list):
  48. # collections_abc.MutableSequence): # avoid abc.__instancecheck__
  49. if params and not isinstance(params[0], (tuple, Mapping)):
  50. raise exc.ArgumentError(
  51. "List argument must consist only of tuples or dictionaries"
  52. )
  53. return params
  54. elif isinstance(params, (tuple, dict)) or isinstance(
  55. # only do abc.__instancecheck__ for Mapping after we've checked
  56. # for plain dictionaries and would otherwise raise
  57. params,
  58. Mapping,
  59. ):
  60. # cast("Union[List[Mapping[str, Any]], Tuple[Any, ...]]", [params])
  61. return [params] # type: ignore
  62. else:
  63. raise exc.ArgumentError("mapping or sequence expected for parameters")