polars-runtime-compat 1.34.0b2__cp39-abi3-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of polars-runtime-compat might be problematic. Click here for more details.

Files changed (203) hide show
  1. _polars_runtime_compat/.gitkeep +0 -0
  2. _polars_runtime_compat/_polars_runtime_compat.pyd +0 -0
  3. polars/__init__.py +528 -0
  4. polars/_cpu_check.py +265 -0
  5. polars/_dependencies.py +355 -0
  6. polars/_plr.py +99 -0
  7. polars/_plr.pyi +2496 -0
  8. polars/_reexport.py +23 -0
  9. polars/_typing.py +478 -0
  10. polars/_utils/__init__.py +37 -0
  11. polars/_utils/async_.py +102 -0
  12. polars/_utils/cache.py +176 -0
  13. polars/_utils/cloud.py +40 -0
  14. polars/_utils/constants.py +29 -0
  15. polars/_utils/construction/__init__.py +46 -0
  16. polars/_utils/construction/dataframe.py +1397 -0
  17. polars/_utils/construction/other.py +72 -0
  18. polars/_utils/construction/series.py +560 -0
  19. polars/_utils/construction/utils.py +118 -0
  20. polars/_utils/convert.py +224 -0
  21. polars/_utils/deprecation.py +406 -0
  22. polars/_utils/getitem.py +457 -0
  23. polars/_utils/logging.py +11 -0
  24. polars/_utils/nest_asyncio.py +264 -0
  25. polars/_utils/parquet.py +15 -0
  26. polars/_utils/parse/__init__.py +12 -0
  27. polars/_utils/parse/expr.py +242 -0
  28. polars/_utils/polars_version.py +19 -0
  29. polars/_utils/pycapsule.py +53 -0
  30. polars/_utils/scan.py +27 -0
  31. polars/_utils/serde.py +63 -0
  32. polars/_utils/slice.py +215 -0
  33. polars/_utils/udfs.py +1251 -0
  34. polars/_utils/unstable.py +63 -0
  35. polars/_utils/various.py +782 -0
  36. polars/_utils/wrap.py +25 -0
  37. polars/api.py +370 -0
  38. polars/catalog/__init__.py +0 -0
  39. polars/catalog/unity/__init__.py +19 -0
  40. polars/catalog/unity/client.py +733 -0
  41. polars/catalog/unity/models.py +152 -0
  42. polars/config.py +1571 -0
  43. polars/convert/__init__.py +25 -0
  44. polars/convert/general.py +1046 -0
  45. polars/convert/normalize.py +261 -0
  46. polars/dataframe/__init__.py +5 -0
  47. polars/dataframe/_html.py +186 -0
  48. polars/dataframe/frame.py +12582 -0
  49. polars/dataframe/group_by.py +1067 -0
  50. polars/dataframe/plotting.py +257 -0
  51. polars/datatype_expr/__init__.py +5 -0
  52. polars/datatype_expr/array.py +56 -0
  53. polars/datatype_expr/datatype_expr.py +304 -0
  54. polars/datatype_expr/list.py +18 -0
  55. polars/datatype_expr/struct.py +69 -0
  56. polars/datatypes/__init__.py +122 -0
  57. polars/datatypes/_parse.py +195 -0
  58. polars/datatypes/_utils.py +48 -0
  59. polars/datatypes/classes.py +1213 -0
  60. polars/datatypes/constants.py +11 -0
  61. polars/datatypes/constructor.py +172 -0
  62. polars/datatypes/convert.py +366 -0
  63. polars/datatypes/group.py +130 -0
  64. polars/exceptions.py +230 -0
  65. polars/expr/__init__.py +7 -0
  66. polars/expr/array.py +964 -0
  67. polars/expr/binary.py +346 -0
  68. polars/expr/categorical.py +306 -0
  69. polars/expr/datetime.py +2620 -0
  70. polars/expr/expr.py +11272 -0
  71. polars/expr/list.py +1408 -0
  72. polars/expr/meta.py +444 -0
  73. polars/expr/name.py +321 -0
  74. polars/expr/string.py +3045 -0
  75. polars/expr/struct.py +357 -0
  76. polars/expr/whenthen.py +185 -0
  77. polars/functions/__init__.py +193 -0
  78. polars/functions/aggregation/__init__.py +33 -0
  79. polars/functions/aggregation/horizontal.py +298 -0
  80. polars/functions/aggregation/vertical.py +341 -0
  81. polars/functions/as_datatype.py +848 -0
  82. polars/functions/business.py +138 -0
  83. polars/functions/col.py +384 -0
  84. polars/functions/datatype.py +121 -0
  85. polars/functions/eager.py +524 -0
  86. polars/functions/escape_regex.py +29 -0
  87. polars/functions/lazy.py +2751 -0
  88. polars/functions/len.py +68 -0
  89. polars/functions/lit.py +210 -0
  90. polars/functions/random.py +22 -0
  91. polars/functions/range/__init__.py +19 -0
  92. polars/functions/range/_utils.py +15 -0
  93. polars/functions/range/date_range.py +303 -0
  94. polars/functions/range/datetime_range.py +370 -0
  95. polars/functions/range/int_range.py +348 -0
  96. polars/functions/range/linear_space.py +311 -0
  97. polars/functions/range/time_range.py +287 -0
  98. polars/functions/repeat.py +301 -0
  99. polars/functions/whenthen.py +353 -0
  100. polars/interchange/__init__.py +10 -0
  101. polars/interchange/buffer.py +77 -0
  102. polars/interchange/column.py +190 -0
  103. polars/interchange/dataframe.py +230 -0
  104. polars/interchange/from_dataframe.py +328 -0
  105. polars/interchange/protocol.py +303 -0
  106. polars/interchange/utils.py +170 -0
  107. polars/io/__init__.py +64 -0
  108. polars/io/_utils.py +317 -0
  109. polars/io/avro.py +49 -0
  110. polars/io/clipboard.py +36 -0
  111. polars/io/cloud/__init__.py +17 -0
  112. polars/io/cloud/_utils.py +80 -0
  113. polars/io/cloud/credential_provider/__init__.py +17 -0
  114. polars/io/cloud/credential_provider/_builder.py +520 -0
  115. polars/io/cloud/credential_provider/_providers.py +618 -0
  116. polars/io/csv/__init__.py +9 -0
  117. polars/io/csv/_utils.py +38 -0
  118. polars/io/csv/batched_reader.py +142 -0
  119. polars/io/csv/functions.py +1495 -0
  120. polars/io/database/__init__.py +6 -0
  121. polars/io/database/_arrow_registry.py +70 -0
  122. polars/io/database/_cursor_proxies.py +147 -0
  123. polars/io/database/_executor.py +578 -0
  124. polars/io/database/_inference.py +314 -0
  125. polars/io/database/_utils.py +144 -0
  126. polars/io/database/functions.py +516 -0
  127. polars/io/delta.py +499 -0
  128. polars/io/iceberg/__init__.py +3 -0
  129. polars/io/iceberg/_utils.py +697 -0
  130. polars/io/iceberg/dataset.py +556 -0
  131. polars/io/iceberg/functions.py +151 -0
  132. polars/io/ipc/__init__.py +8 -0
  133. polars/io/ipc/functions.py +514 -0
  134. polars/io/json/__init__.py +3 -0
  135. polars/io/json/read.py +101 -0
  136. polars/io/ndjson.py +332 -0
  137. polars/io/parquet/__init__.py +17 -0
  138. polars/io/parquet/field_overwrites.py +140 -0
  139. polars/io/parquet/functions.py +722 -0
  140. polars/io/partition.py +491 -0
  141. polars/io/plugins.py +187 -0
  142. polars/io/pyarrow_dataset/__init__.py +5 -0
  143. polars/io/pyarrow_dataset/anonymous_scan.py +109 -0
  144. polars/io/pyarrow_dataset/functions.py +79 -0
  145. polars/io/scan_options/__init__.py +5 -0
  146. polars/io/scan_options/_options.py +59 -0
  147. polars/io/scan_options/cast_options.py +126 -0
  148. polars/io/spreadsheet/__init__.py +6 -0
  149. polars/io/spreadsheet/_utils.py +52 -0
  150. polars/io/spreadsheet/_write_utils.py +647 -0
  151. polars/io/spreadsheet/functions.py +1323 -0
  152. polars/lazyframe/__init__.py +9 -0
  153. polars/lazyframe/engine_config.py +61 -0
  154. polars/lazyframe/frame.py +8564 -0
  155. polars/lazyframe/group_by.py +669 -0
  156. polars/lazyframe/in_process.py +42 -0
  157. polars/lazyframe/opt_flags.py +333 -0
  158. polars/meta/__init__.py +14 -0
  159. polars/meta/build.py +33 -0
  160. polars/meta/index_type.py +27 -0
  161. polars/meta/thread_pool.py +50 -0
  162. polars/meta/versions.py +120 -0
  163. polars/ml/__init__.py +0 -0
  164. polars/ml/torch.py +213 -0
  165. polars/ml/utilities.py +30 -0
  166. polars/plugins.py +155 -0
  167. polars/py.typed +0 -0
  168. polars/pyproject.toml +96 -0
  169. polars/schema.py +265 -0
  170. polars/selectors.py +3117 -0
  171. polars/series/__init__.py +5 -0
  172. polars/series/array.py +776 -0
  173. polars/series/binary.py +254 -0
  174. polars/series/categorical.py +246 -0
  175. polars/series/datetime.py +2275 -0
  176. polars/series/list.py +1087 -0
  177. polars/series/plotting.py +191 -0
  178. polars/series/series.py +9197 -0
  179. polars/series/string.py +2367 -0
  180. polars/series/struct.py +154 -0
  181. polars/series/utils.py +191 -0
  182. polars/sql/__init__.py +7 -0
  183. polars/sql/context.py +677 -0
  184. polars/sql/functions.py +139 -0
  185. polars/string_cache.py +185 -0
  186. polars/testing/__init__.py +13 -0
  187. polars/testing/asserts/__init__.py +9 -0
  188. polars/testing/asserts/frame.py +231 -0
  189. polars/testing/asserts/series.py +219 -0
  190. polars/testing/asserts/utils.py +12 -0
  191. polars/testing/parametric/__init__.py +33 -0
  192. polars/testing/parametric/profiles.py +107 -0
  193. polars/testing/parametric/strategies/__init__.py +22 -0
  194. polars/testing/parametric/strategies/_utils.py +14 -0
  195. polars/testing/parametric/strategies/core.py +615 -0
  196. polars/testing/parametric/strategies/data.py +452 -0
  197. polars/testing/parametric/strategies/dtype.py +436 -0
  198. polars/testing/parametric/strategies/legacy.py +169 -0
  199. polars/type_aliases.py +24 -0
  200. polars_runtime_compat-1.34.0b2.dist-info/METADATA +31 -0
  201. polars_runtime_compat-1.34.0b2.dist-info/RECORD +203 -0
  202. polars_runtime_compat-1.34.0b2.dist-info/WHEEL +4 -0
  203. polars_runtime_compat-1.34.0b2.dist-info/licenses/LICENSE +1 -0
@@ -0,0 +1,219 @@
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ from typing import Any
5
+
6
+ from polars._utils.deprecation import deprecate_renamed_parameter
7
+ from polars.series import Series
8
+ from polars.testing.asserts.utils import raise_assertion_error
9
+
10
+ with contextlib.suppress(ImportError): # Module not available when building docs
11
+ from polars._plr import assert_series_equal_py
12
+
13
+
14
+ def _assert_correct_input_type(left: Any, right: Any) -> bool:
15
+ __tracebackhide__ = True
16
+
17
+ if not (isinstance(left, Series) and isinstance(right, Series)):
18
+ raise_assertion_error(
19
+ "inputs",
20
+ "unexpected input types",
21
+ type(left).__name__,
22
+ type(right).__name__,
23
+ )
24
+ return True
25
+
26
+
27
+ @deprecate_renamed_parameter("check_dtype", "check_dtypes", version="0.20.31")
28
+ @deprecate_renamed_parameter("rtol", "rel_tol", version="1.32.3")
29
+ @deprecate_renamed_parameter("atol", "abs_tol", version="1.32.3")
30
+ def assert_series_equal(
31
+ left: Series,
32
+ right: Series,
33
+ *,
34
+ check_dtypes: bool = True,
35
+ check_names: bool = True,
36
+ check_order: bool = True,
37
+ check_exact: bool = False,
38
+ rel_tol: float = 1e-5,
39
+ abs_tol: float = 1e-8,
40
+ categorical_as_str: bool = False,
41
+ ) -> None:
42
+ """
43
+ Assert that the left and right Series are equal.
44
+
45
+ Raises a detailed `AssertionError` if the Series differ.
46
+ This function is intended for use in unit tests.
47
+
48
+ .. versionchanged:: 0.20.31
49
+ The `check_dtype` parameter was renamed `check_dtypes`.
50
+
51
+ .. versionchanged:: 1.32.3
52
+ The `rtol` and `atol` parameters were renamed to `rel_tol` and `abs_tol`,
53
+ respectively.
54
+
55
+ Parameters
56
+ ----------
57
+ left
58
+ The first Series to compare.
59
+ right
60
+ The second Series to compare.
61
+ check_dtypes
62
+ Requires data types to match.
63
+ check_names
64
+ Requires names to match.
65
+ check_order
66
+ Requires elements to appear in the same order.
67
+ check_exact
68
+ Requires float values to match exactly. If set to `False`, values are considered
69
+ equal when within tolerance of each other (see `rel_tol` and `abs_tol`).
70
+ Only affects columns with a Float data type.
71
+ rel_tol
72
+ Relative tolerance for inexact checking, given as a fraction of the values in
73
+ `right`.
74
+ abs_tol
75
+ Absolute tolerance for inexact checking.
76
+ categorical_as_str
77
+ Cast categorical columns to string before comparing. Enabling this helps
78
+ compare columns that do not share the same string cache.
79
+
80
+ See Also
81
+ --------
82
+ assert_frame_equal
83
+ assert_series_not_equal
84
+
85
+ Notes
86
+ -----
87
+ When using pytest, it may be worthwhile to shorten Python traceback printing
88
+ by passing `--tb=short`. The default mode tends to be unhelpfully verbose.
89
+ More information in the
90
+ `pytest docs <https://docs.pytest.org/en/latest/how-to/output.html#modifying-python-traceback-printing>`_.
91
+
92
+ Examples
93
+ --------
94
+ >>> from polars.testing import assert_series_equal
95
+ >>> s1 = pl.Series([1, 2, 3])
96
+ >>> s2 = pl.Series([1, 5, 3])
97
+ >>> assert_series_equal(s1, s2)
98
+ Traceback (most recent call last):
99
+ ...
100
+ AssertionError: Series are different (exact value mismatch)
101
+ [left]: shape: (3,)
102
+ Series: '' [i64]
103
+ [
104
+ 1
105
+ 2
106
+ 3
107
+ ]
108
+ [right]: shape: (3,)
109
+ Series: '' [i64]
110
+ [
111
+ 1
112
+ 5
113
+ 3
114
+ ]
115
+ """
116
+ __tracebackhide__ = True
117
+
118
+ _assert_correct_input_type(left, right)
119
+
120
+ assert_series_equal_py(
121
+ left._s,
122
+ right._s,
123
+ check_dtypes=check_dtypes,
124
+ check_names=check_names,
125
+ check_order=check_order,
126
+ check_exact=check_exact,
127
+ rel_tol=rel_tol,
128
+ abs_tol=abs_tol,
129
+ categorical_as_str=categorical_as_str,
130
+ )
131
+
132
+
133
+ @deprecate_renamed_parameter("check_dtype", "check_dtypes", version="0.20.31")
134
+ @deprecate_renamed_parameter("rtol", "rel_tol", version="1.32.3")
135
+ @deprecate_renamed_parameter("atol", "abs_tol", version="1.32.3")
136
+ def assert_series_not_equal(
137
+ left: Series,
138
+ right: Series,
139
+ *,
140
+ check_dtypes: bool = True,
141
+ check_names: bool = True,
142
+ check_order: bool = True,
143
+ check_exact: bool = False,
144
+ rel_tol: float = 1e-5,
145
+ abs_tol: float = 1e-8,
146
+ categorical_as_str: bool = False,
147
+ ) -> None:
148
+ """
149
+ Assert that the left and right Series are **not** equal.
150
+
151
+ This function is intended for use in unit tests.
152
+
153
+ .. versionchanged:: 0.20.31
154
+ The `check_dtype` parameter was renamed `check_dtypes`.
155
+
156
+ .. versionchanged:: 1.32.3
157
+ The `rtol` and `atol` parameters were renamed to `rel_tol` and `abs_tol`,
158
+ respectively.
159
+
160
+ Parameters
161
+ ----------
162
+ left
163
+ The first Series to compare.
164
+ right
165
+ The second Series to compare.
166
+ check_dtypes
167
+ Requires data types to match.
168
+ check_names
169
+ Requires names to match.
170
+ check_order
171
+ Requires elements to appear in the same order.
172
+ check_exact
173
+ Requires float values to match exactly. If set to `False`, values are considered
174
+ equal when within tolerance of each other (see `rel_tol` and `abs_tol`).
175
+ Only affects columns with a Float data type.
176
+ rel_tol
177
+ Relative tolerance for inexact checking, given as a fraction of the values in
178
+ `right`.
179
+ abs_tol
180
+ Absolute tolerance for inexact checking.
181
+ categorical_as_str
182
+ Cast categorical columns to string before comparing. Enabling this helps
183
+ compare columns that do not share the same string cache.
184
+
185
+ See Also
186
+ --------
187
+ assert_series_equal
188
+ assert_frame_not_equal
189
+
190
+ Examples
191
+ --------
192
+ >>> from polars.testing import assert_series_not_equal
193
+ >>> s1 = pl.Series([1, 2, 3])
194
+ >>> s2 = pl.Series([1, 2, 3])
195
+ >>> assert_series_not_equal(s1, s2)
196
+ Traceback (most recent call last):
197
+ ...
198
+ AssertionError: Series are equal (but are expected not to be)
199
+ """
200
+ __tracebackhide__ = True
201
+
202
+ _assert_correct_input_type(left, right)
203
+ try:
204
+ assert_series_equal(
205
+ left=left,
206
+ right=right,
207
+ check_dtypes=check_dtypes,
208
+ check_names=check_names,
209
+ check_order=check_order,
210
+ check_exact=check_exact,
211
+ rel_tol=rel_tol,
212
+ abs_tol=abs_tol,
213
+ categorical_as_str=categorical_as_str,
214
+ )
215
+ except AssertionError:
216
+ return
217
+ else:
218
+ msg = "Series are equal (but are expected not to be)"
219
+ raise AssertionError(msg)
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, NoReturn
4
+
5
+
6
+ def raise_assertion_error(
7
+ objects: str, detail: str, left: Any, right: Any, *, cause: Exception | None = None
8
+ ) -> NoReturn:
9
+ """Raise a detailed assertion error."""
10
+ __tracebackhide__ = True
11
+ msg = f"{objects} are different ({detail})\n[left]: {left}\n[right]: {right}"
12
+ raise AssertionError(msg) from cause
@@ -0,0 +1,33 @@
1
+ from polars._dependencies import _HYPOTHESIS_AVAILABLE
2
+
3
+ if not _HYPOTHESIS_AVAILABLE:
4
+ msg = (
5
+ "polars.testing.parametric requires the 'hypothesis' module\n"
6
+ "Please install it using the command: pip install hypothesis"
7
+ )
8
+ raise ModuleNotFoundError(msg)
9
+
10
+ from polars.testing.parametric.profiles import load_profile, set_profile
11
+ from polars.testing.parametric.strategies import (
12
+ column,
13
+ columns,
14
+ create_list_strategy,
15
+ dataframes,
16
+ dtypes,
17
+ lists,
18
+ series,
19
+ )
20
+
21
+ __all__ = [
22
+ # strategies
23
+ "dataframes",
24
+ "series",
25
+ "column",
26
+ "columns",
27
+ "dtypes",
28
+ "lists",
29
+ "create_list_strategy",
30
+ # profiles
31
+ "load_profile",
32
+ "set_profile",
33
+ ]
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import re
5
+
6
+ from hypothesis import settings
7
+
8
+ from polars._typing import ParametricProfileNames
9
+
10
+
11
+ def load_profile(
12
+ profile: ParametricProfileNames | int = "fast", *, set_environment: bool = False
13
+ ) -> None:
14
+ """
15
+ Load a named (or custom) hypothesis profile for use with the parametric tests.
16
+
17
+ .. warning::
18
+ This functionality is currently considered **unstable**. It may be
19
+ changed at any point without it being considered a breaking change.
20
+
21
+ Parameters
22
+ ----------
23
+ profile : {str, int}, optional
24
+ Name of the profile to load; one of "fast", "balanced", "expensive", or
25
+ the integer number of iterations to run (which will create and register
26
+ a custom profile with that value).
27
+
28
+ set_environment : bool, default False
29
+ If True, also set the environment variable `POLARS_HYPOTHESIS_PROFILE`
30
+ to the given profile name/value.
31
+
32
+ Examples
33
+ --------
34
+ >>> # load a custom profile that will run with 1500 iterations
35
+ >>> from polars.testing.parametric import load_profile
36
+ >>> load_profile(1500)
37
+ """
38
+ common_settings = {"print_blob": True, "deadline": None}
39
+ profile_name = str(profile)
40
+
41
+ # Register standard/named profiles
42
+ # --------------------------------
43
+ for name, iterations in (
44
+ ("fast", 100),
45
+ ("balanced", 1_000),
46
+ ("expensive", 10_000),
47
+ ):
48
+ settings.register_profile(
49
+ name=f"polars.{name}",
50
+ max_examples=iterations,
51
+ **common_settings, # type: ignore[arg-type]
52
+ )
53
+
54
+ # Register a custom profile with 'n' iterations.
55
+ # ----------------------------------------------
56
+ # (Set the ideal number to balance time-vs-coverage for your machine).
57
+ if profile_name.isdigit() or re.match(r"polars\.custom\.[\d_]+$", profile_name):
58
+ n_iterations = int(profile_name.replace("polars.custom.", ""))
59
+ profile_name = f"polars.custom.{profile_name}"
60
+ settings.register_profile(
61
+ name=profile_name,
62
+ max_examples=n_iterations,
63
+ **common_settings, # type: ignore[arg-type]
64
+ )
65
+
66
+ # Load the chosen profile
67
+ profile_name = f"polars.{profile_name.replace('polars.', '')}"
68
+ settings.load_profile(profile_name)
69
+
70
+ if set_environment:
71
+ set_profile(profile_name) # type: ignore[arg-type]
72
+
73
+
74
+ def set_profile(profile: ParametricProfileNames | int) -> None:
75
+ """
76
+ Set the env var `POLARS_HYPOTHESIS_PROFILE` to the given profile name/value.
77
+
78
+ .. warning::
79
+ This functionality is currently considered **unstable**. It may be
80
+ changed at any point without it being considered a breaking change.
81
+
82
+ Parameters
83
+ ----------
84
+ profile : {str, int}, optional
85
+ Name of the profile to load; one of "fast", "balanced", "expensive", or
86
+ the integer number of iterations to run (which will create and register
87
+ a custom profile with that value).
88
+
89
+ Examples
90
+ --------
91
+ >>> # prefer the 'balanced' profile for running parametric tests
92
+ >>> from polars.testing.parametric import set_profile
93
+ >>> set_profile("balanced")
94
+ """
95
+ profile_name = str(profile).split(".")[-1]
96
+ if profile_name.replace("_", "").isdigit():
97
+ profile_name = str(int(profile_name))
98
+
99
+ else:
100
+ from typing import get_args
101
+
102
+ valid_profile_names = get_args(ParametricProfileNames)
103
+ if profile_name not in valid_profile_names:
104
+ msg = f"invalid profile name {profile_name!r}; expected one of {valid_profile_names!r}"
105
+ raise ValueError(msg)
106
+
107
+ os.environ["POLARS_HYPOTHESIS_PROFILE"] = profile_name
@@ -0,0 +1,22 @@
1
+ from polars.testing.parametric.strategies.core import (
2
+ column,
3
+ dataframes,
4
+ series,
5
+ )
6
+ from polars.testing.parametric.strategies.data import lists
7
+ from polars.testing.parametric.strategies.dtype import dtypes
8
+ from polars.testing.parametric.strategies.legacy import columns, create_list_strategy
9
+
10
+ __all__ = [
11
+ # core
12
+ "dataframes",
13
+ "series",
14
+ "column",
15
+ # dtype
16
+ "dtypes",
17
+ # data
18
+ "lists",
19
+ # legacy
20
+ "columns",
21
+ "create_list_strategy",
22
+ ]
@@ -0,0 +1,14 @@
1
+ from typing import Any
2
+
3
+
4
+ def flexhash(elem: Any) -> int:
5
+ """
6
+ Hashing function that also handles lists and dictionaries.
7
+
8
+ Used for `unique` check in nested strategies.
9
+ """
10
+ if isinstance(elem, list):
11
+ return hash(tuple(flexhash(e) for e in elem))
12
+ elif isinstance(elem, dict):
13
+ return hash(tuple((k, flexhash(v)) for k, v in elem.items()))
14
+ return hash(elem)