polars-runtime-compat 1.34.0b3__cp39-abi3-win_arm64.whl → 1.34.0b4__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.
- _polars_runtime_compat/_polars_runtime_compat.pyd +0 -0
- {polars_runtime_compat-1.34.0b3.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/METADATA +1 -1
- polars_runtime_compat-1.34.0b4.dist-info/RECORD +6 -0
- polars/__init__.py +0 -528
- polars/_cpu_check.py +0 -265
- polars/_dependencies.py +0 -355
- polars/_plr.py +0 -99
- polars/_plr.pyi +0 -2496
- polars/_reexport.py +0 -23
- polars/_typing.py +0 -478
- polars/_utils/__init__.py +0 -37
- polars/_utils/async_.py +0 -102
- polars/_utils/cache.py +0 -176
- polars/_utils/cloud.py +0 -40
- polars/_utils/constants.py +0 -29
- polars/_utils/construction/__init__.py +0 -46
- polars/_utils/construction/dataframe.py +0 -1397
- polars/_utils/construction/other.py +0 -72
- polars/_utils/construction/series.py +0 -560
- polars/_utils/construction/utils.py +0 -118
- polars/_utils/convert.py +0 -224
- polars/_utils/deprecation.py +0 -406
- polars/_utils/getitem.py +0 -457
- polars/_utils/logging.py +0 -11
- polars/_utils/nest_asyncio.py +0 -264
- polars/_utils/parquet.py +0 -15
- polars/_utils/parse/__init__.py +0 -12
- polars/_utils/parse/expr.py +0 -242
- polars/_utils/polars_version.py +0 -19
- polars/_utils/pycapsule.py +0 -53
- polars/_utils/scan.py +0 -27
- polars/_utils/serde.py +0 -63
- polars/_utils/slice.py +0 -215
- polars/_utils/udfs.py +0 -1251
- polars/_utils/unstable.py +0 -63
- polars/_utils/various.py +0 -782
- polars/_utils/wrap.py +0 -25
- polars/api.py +0 -370
- polars/catalog/__init__.py +0 -0
- polars/catalog/unity/__init__.py +0 -19
- polars/catalog/unity/client.py +0 -733
- polars/catalog/unity/models.py +0 -152
- polars/config.py +0 -1571
- polars/convert/__init__.py +0 -25
- polars/convert/general.py +0 -1046
- polars/convert/normalize.py +0 -261
- polars/dataframe/__init__.py +0 -5
- polars/dataframe/_html.py +0 -186
- polars/dataframe/frame.py +0 -12582
- polars/dataframe/group_by.py +0 -1067
- polars/dataframe/plotting.py +0 -257
- polars/datatype_expr/__init__.py +0 -5
- polars/datatype_expr/array.py +0 -56
- polars/datatype_expr/datatype_expr.py +0 -304
- polars/datatype_expr/list.py +0 -18
- polars/datatype_expr/struct.py +0 -69
- polars/datatypes/__init__.py +0 -122
- polars/datatypes/_parse.py +0 -195
- polars/datatypes/_utils.py +0 -48
- polars/datatypes/classes.py +0 -1213
- polars/datatypes/constants.py +0 -11
- polars/datatypes/constructor.py +0 -172
- polars/datatypes/convert.py +0 -366
- polars/datatypes/group.py +0 -130
- polars/exceptions.py +0 -230
- polars/expr/__init__.py +0 -7
- polars/expr/array.py +0 -964
- polars/expr/binary.py +0 -346
- polars/expr/categorical.py +0 -306
- polars/expr/datetime.py +0 -2620
- polars/expr/expr.py +0 -11272
- polars/expr/list.py +0 -1408
- polars/expr/meta.py +0 -444
- polars/expr/name.py +0 -321
- polars/expr/string.py +0 -3045
- polars/expr/struct.py +0 -357
- polars/expr/whenthen.py +0 -185
- polars/functions/__init__.py +0 -193
- polars/functions/aggregation/__init__.py +0 -33
- polars/functions/aggregation/horizontal.py +0 -298
- polars/functions/aggregation/vertical.py +0 -341
- polars/functions/as_datatype.py +0 -848
- polars/functions/business.py +0 -138
- polars/functions/col.py +0 -384
- polars/functions/datatype.py +0 -121
- polars/functions/eager.py +0 -524
- polars/functions/escape_regex.py +0 -29
- polars/functions/lazy.py +0 -2751
- polars/functions/len.py +0 -68
- polars/functions/lit.py +0 -210
- polars/functions/random.py +0 -22
- polars/functions/range/__init__.py +0 -19
- polars/functions/range/_utils.py +0 -15
- polars/functions/range/date_range.py +0 -303
- polars/functions/range/datetime_range.py +0 -370
- polars/functions/range/int_range.py +0 -348
- polars/functions/range/linear_space.py +0 -311
- polars/functions/range/time_range.py +0 -287
- polars/functions/repeat.py +0 -301
- polars/functions/whenthen.py +0 -353
- polars/interchange/__init__.py +0 -10
- polars/interchange/buffer.py +0 -77
- polars/interchange/column.py +0 -190
- polars/interchange/dataframe.py +0 -230
- polars/interchange/from_dataframe.py +0 -328
- polars/interchange/protocol.py +0 -303
- polars/interchange/utils.py +0 -170
- polars/io/__init__.py +0 -64
- polars/io/_utils.py +0 -317
- polars/io/avro.py +0 -49
- polars/io/clipboard.py +0 -36
- polars/io/cloud/__init__.py +0 -17
- polars/io/cloud/_utils.py +0 -80
- polars/io/cloud/credential_provider/__init__.py +0 -17
- polars/io/cloud/credential_provider/_builder.py +0 -520
- polars/io/cloud/credential_provider/_providers.py +0 -618
- polars/io/csv/__init__.py +0 -9
- polars/io/csv/_utils.py +0 -38
- polars/io/csv/batched_reader.py +0 -142
- polars/io/csv/functions.py +0 -1495
- polars/io/database/__init__.py +0 -6
- polars/io/database/_arrow_registry.py +0 -70
- polars/io/database/_cursor_proxies.py +0 -147
- polars/io/database/_executor.py +0 -578
- polars/io/database/_inference.py +0 -314
- polars/io/database/_utils.py +0 -144
- polars/io/database/functions.py +0 -516
- polars/io/delta.py +0 -499
- polars/io/iceberg/__init__.py +0 -3
- polars/io/iceberg/_utils.py +0 -697
- polars/io/iceberg/dataset.py +0 -556
- polars/io/iceberg/functions.py +0 -151
- polars/io/ipc/__init__.py +0 -8
- polars/io/ipc/functions.py +0 -514
- polars/io/json/__init__.py +0 -3
- polars/io/json/read.py +0 -101
- polars/io/ndjson.py +0 -332
- polars/io/parquet/__init__.py +0 -17
- polars/io/parquet/field_overwrites.py +0 -140
- polars/io/parquet/functions.py +0 -722
- polars/io/partition.py +0 -491
- polars/io/plugins.py +0 -187
- polars/io/pyarrow_dataset/__init__.py +0 -5
- polars/io/pyarrow_dataset/anonymous_scan.py +0 -109
- polars/io/pyarrow_dataset/functions.py +0 -79
- polars/io/scan_options/__init__.py +0 -5
- polars/io/scan_options/_options.py +0 -59
- polars/io/scan_options/cast_options.py +0 -126
- polars/io/spreadsheet/__init__.py +0 -6
- polars/io/spreadsheet/_utils.py +0 -52
- polars/io/spreadsheet/_write_utils.py +0 -647
- polars/io/spreadsheet/functions.py +0 -1323
- polars/lazyframe/__init__.py +0 -9
- polars/lazyframe/engine_config.py +0 -61
- polars/lazyframe/frame.py +0 -8564
- polars/lazyframe/group_by.py +0 -669
- polars/lazyframe/in_process.py +0 -42
- polars/lazyframe/opt_flags.py +0 -333
- polars/meta/__init__.py +0 -14
- polars/meta/build.py +0 -33
- polars/meta/index_type.py +0 -27
- polars/meta/thread_pool.py +0 -50
- polars/meta/versions.py +0 -120
- polars/ml/__init__.py +0 -0
- polars/ml/torch.py +0 -213
- polars/ml/utilities.py +0 -30
- polars/plugins.py +0 -155
- polars/py.typed +0 -0
- polars/pyproject.toml +0 -103
- polars/schema.py +0 -265
- polars/selectors.py +0 -3117
- polars/series/__init__.py +0 -5
- polars/series/array.py +0 -776
- polars/series/binary.py +0 -254
- polars/series/categorical.py +0 -246
- polars/series/datetime.py +0 -2275
- polars/series/list.py +0 -1087
- polars/series/plotting.py +0 -191
- polars/series/series.py +0 -9197
- polars/series/string.py +0 -2367
- polars/series/struct.py +0 -154
- polars/series/utils.py +0 -191
- polars/sql/__init__.py +0 -7
- polars/sql/context.py +0 -677
- polars/sql/functions.py +0 -139
- polars/string_cache.py +0 -185
- polars/testing/__init__.py +0 -13
- polars/testing/asserts/__init__.py +0 -9
- polars/testing/asserts/frame.py +0 -231
- polars/testing/asserts/series.py +0 -219
- polars/testing/asserts/utils.py +0 -12
- polars/testing/parametric/__init__.py +0 -33
- polars/testing/parametric/profiles.py +0 -107
- polars/testing/parametric/strategies/__init__.py +0 -22
- polars/testing/parametric/strategies/_utils.py +0 -14
- polars/testing/parametric/strategies/core.py +0 -615
- polars/testing/parametric/strategies/data.py +0 -452
- polars/testing/parametric/strategies/dtype.py +0 -436
- polars/testing/parametric/strategies/legacy.py +0 -169
- polars/type_aliases.py +0 -24
- polars_runtime_compat-1.34.0b3.dist-info/RECORD +0 -203
- {polars_runtime_compat-1.34.0b3.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/WHEEL +0 -0
- {polars_runtime_compat-1.34.0b3.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/licenses/LICENSE +0 -0
polars/series/struct.py
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import sys
|
|
4
|
-
from typing import TYPE_CHECKING
|
|
5
|
-
|
|
6
|
-
from polars._utils.various import (
|
|
7
|
-
BUILDING_SPHINX_DOCS,
|
|
8
|
-
qualified_type_name,
|
|
9
|
-
sphinx_accessor,
|
|
10
|
-
)
|
|
11
|
-
from polars._utils.wrap import wrap_df
|
|
12
|
-
from polars.schema import Schema
|
|
13
|
-
from polars.series.utils import expr_dispatch
|
|
14
|
-
|
|
15
|
-
if TYPE_CHECKING:
|
|
16
|
-
from collections.abc import Sequence
|
|
17
|
-
|
|
18
|
-
from polars import DataFrame, Series
|
|
19
|
-
from polars._plr import PySeries
|
|
20
|
-
elif BUILDING_SPHINX_DOCS:
|
|
21
|
-
# note: we assign this way to work around an autocomplete issue in ipython/jedi
|
|
22
|
-
# (ref: https://github.com/davidhalter/jedi/issues/2057)
|
|
23
|
-
current_module = sys.modules[__name__]
|
|
24
|
-
current_module.property = sphinx_accessor
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@expr_dispatch
|
|
28
|
-
class StructNameSpace:
|
|
29
|
-
"""Series.struct namespace."""
|
|
30
|
-
|
|
31
|
-
_accessor = "struct"
|
|
32
|
-
|
|
33
|
-
def __init__(self, series: Series) -> None:
|
|
34
|
-
self._s: PySeries = series._s
|
|
35
|
-
|
|
36
|
-
def __getitem__(self, item: int | str) -> Series:
|
|
37
|
-
if isinstance(item, int):
|
|
38
|
-
return self.field(self.fields[item])
|
|
39
|
-
elif isinstance(item, str):
|
|
40
|
-
return self.field(item)
|
|
41
|
-
else:
|
|
42
|
-
msg = f"expected type 'int | str', got {qualified_type_name(item)!r}"
|
|
43
|
-
raise TypeError(msg)
|
|
44
|
-
|
|
45
|
-
def _ipython_key_completions_(self) -> list[str]:
|
|
46
|
-
return self.fields
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def fields(self) -> list[str]:
|
|
50
|
-
"""
|
|
51
|
-
Get the names of the fields.
|
|
52
|
-
|
|
53
|
-
Examples
|
|
54
|
-
--------
|
|
55
|
-
>>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
|
|
56
|
-
>>> s.struct.fields
|
|
57
|
-
['a', 'b']
|
|
58
|
-
"""
|
|
59
|
-
if getattr(self, "_s", None) is None:
|
|
60
|
-
return []
|
|
61
|
-
return self._s.struct_fields()
|
|
62
|
-
|
|
63
|
-
def field(self, name: str) -> Series:
|
|
64
|
-
"""
|
|
65
|
-
Retrieve one of the fields of this `Struct` as a new Series.
|
|
66
|
-
|
|
67
|
-
Parameters
|
|
68
|
-
----------
|
|
69
|
-
name
|
|
70
|
-
Name of the field.
|
|
71
|
-
|
|
72
|
-
Examples
|
|
73
|
-
--------
|
|
74
|
-
>>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
|
|
75
|
-
>>> s.struct.field("a")
|
|
76
|
-
shape: (2,)
|
|
77
|
-
Series: 'a' [i64]
|
|
78
|
-
[
|
|
79
|
-
1
|
|
80
|
-
3
|
|
81
|
-
]
|
|
82
|
-
"""
|
|
83
|
-
|
|
84
|
-
def rename_fields(self, names: Sequence[str]) -> Series:
|
|
85
|
-
"""
|
|
86
|
-
Rename the fields of the struct.
|
|
87
|
-
|
|
88
|
-
Parameters
|
|
89
|
-
----------
|
|
90
|
-
names
|
|
91
|
-
New names in the order of the struct's fields.
|
|
92
|
-
|
|
93
|
-
Examples
|
|
94
|
-
--------
|
|
95
|
-
>>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
|
|
96
|
-
>>> s.struct.fields
|
|
97
|
-
['a', 'b']
|
|
98
|
-
>>> s = s.struct.rename_fields(["c", "d"])
|
|
99
|
-
>>> s.struct.fields
|
|
100
|
-
['c', 'd']
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
|
-
@property
|
|
104
|
-
def schema(self) -> Schema:
|
|
105
|
-
"""
|
|
106
|
-
Get the struct definition as a name/dtype schema dict.
|
|
107
|
-
|
|
108
|
-
Examples
|
|
109
|
-
--------
|
|
110
|
-
>>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
|
|
111
|
-
>>> s.struct.schema
|
|
112
|
-
Schema({'a': Int64, 'b': Int64})
|
|
113
|
-
"""
|
|
114
|
-
if getattr(self, "_s", None) is None:
|
|
115
|
-
return Schema({})
|
|
116
|
-
|
|
117
|
-
schema = self._s.dtype().to_schema()
|
|
118
|
-
return Schema(schema, check_dtypes=False)
|
|
119
|
-
|
|
120
|
-
def unnest(self) -> DataFrame:
|
|
121
|
-
"""
|
|
122
|
-
Convert this struct Series to a DataFrame with a separate column for each field.
|
|
123
|
-
|
|
124
|
-
Examples
|
|
125
|
-
--------
|
|
126
|
-
>>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
|
|
127
|
-
>>> s.struct.unnest()
|
|
128
|
-
shape: (2, 2)
|
|
129
|
-
┌─────┬─────┐
|
|
130
|
-
│ a ┆ b │
|
|
131
|
-
│ --- ┆ --- │
|
|
132
|
-
│ i64 ┆ i64 │
|
|
133
|
-
╞═════╪═════╡
|
|
134
|
-
│ 1 ┆ 2 │
|
|
135
|
-
│ 3 ┆ 4 │
|
|
136
|
-
└─────┴─────┘
|
|
137
|
-
"""
|
|
138
|
-
return wrap_df(self._s.struct_unnest())
|
|
139
|
-
|
|
140
|
-
def json_encode(self) -> Series:
|
|
141
|
-
"""
|
|
142
|
-
Convert this struct to a string column with json values.
|
|
143
|
-
|
|
144
|
-
Examples
|
|
145
|
-
--------
|
|
146
|
-
>>> s = pl.Series("a", [{"a": [1, 2], "b": [45]}, {"a": [9, 1, 3], "b": None}])
|
|
147
|
-
>>> s.struct.json_encode()
|
|
148
|
-
shape: (2,)
|
|
149
|
-
Series: 'a' [str]
|
|
150
|
-
[
|
|
151
|
-
"{"a":[1,2],"b":[45]}"
|
|
152
|
-
"{"a":[9,1,3],"b":null}"
|
|
153
|
-
]
|
|
154
|
-
"""
|
polars/series/utils.py
DELETED
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
import sys
|
|
5
|
-
from functools import wraps
|
|
6
|
-
from typing import TYPE_CHECKING, Any, Callable, TypeVar
|
|
7
|
-
|
|
8
|
-
import polars._reexport as pl
|
|
9
|
-
from polars import functions as F
|
|
10
|
-
from polars._utils.wrap import wrap_s
|
|
11
|
-
from polars.datatypes import dtype_to_ffiname
|
|
12
|
-
|
|
13
|
-
if TYPE_CHECKING:
|
|
14
|
-
from polars import Series
|
|
15
|
-
from polars._plr import PySeries
|
|
16
|
-
from polars._typing import PolarsDataType
|
|
17
|
-
|
|
18
|
-
if sys.version_info >= (3, 10):
|
|
19
|
-
from typing import ParamSpec
|
|
20
|
-
else:
|
|
21
|
-
from typing_extensions import ParamSpec
|
|
22
|
-
|
|
23
|
-
T = TypeVar("T")
|
|
24
|
-
P = ParamSpec("P")
|
|
25
|
-
SeriesMethod = Callable[..., Series]
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def expr_dispatch(cls: type[T]) -> type[T]:
|
|
29
|
-
"""
|
|
30
|
-
Series/NameSpace class decorator that sets up expression dispatch.
|
|
31
|
-
|
|
32
|
-
* Applied to the Series class, and/or any Series 'NameSpace' classes.
|
|
33
|
-
* Walks the class attributes, looking for methods that have empty function
|
|
34
|
-
bodies, with signatures compatible with an existing Expr function.
|
|
35
|
-
* IFF both conditions are met, the empty method is decorated with @call_expr.
|
|
36
|
-
"""
|
|
37
|
-
# create lookup of expression functions in this namespace
|
|
38
|
-
namespace = getattr(cls, "_accessor", None)
|
|
39
|
-
expr_lookup = _expr_lookup(namespace)
|
|
40
|
-
|
|
41
|
-
for name in dir(cls):
|
|
42
|
-
if (
|
|
43
|
-
# private
|
|
44
|
-
not name.startswith("_")
|
|
45
|
-
# Avoid error when building docs
|
|
46
|
-
# https://github.com/pola-rs/polars/pull/13238#discussion_r1438787093
|
|
47
|
-
# TODO: is there a better way to do this?
|
|
48
|
-
and name != "plot"
|
|
49
|
-
):
|
|
50
|
-
attr = getattr(cls, name)
|
|
51
|
-
if callable(attr):
|
|
52
|
-
attr = _undecorated(attr)
|
|
53
|
-
# note: `co_varnames` starts with the function args, but needs to be
|
|
54
|
-
# constrained by `co_argcount` as it also includes function-level consts
|
|
55
|
-
args = attr.__code__.co_varnames[: attr.__code__.co_argcount]
|
|
56
|
-
# if an expression method with compatible method exists, further check
|
|
57
|
-
# that the series implementation has an empty function body
|
|
58
|
-
if (namespace, name, args) in expr_lookup and _is_empty_method(attr):
|
|
59
|
-
setattr(cls, name, call_expr(attr))
|
|
60
|
-
return cls
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def _expr_lookup(namespace: str | None) -> set[tuple[str | None, str, tuple[str, ...]]]:
|
|
64
|
-
"""Create lookup of potential Expr methods (in the given namespace)."""
|
|
65
|
-
# dummy Expr object that we can introspect
|
|
66
|
-
expr = pl.Expr()
|
|
67
|
-
expr._pyexpr = None # type: ignore[assignment]
|
|
68
|
-
|
|
69
|
-
# optional indirection to "expr.str", "expr.dt", etc
|
|
70
|
-
if namespace is not None:
|
|
71
|
-
expr = getattr(expr, namespace)
|
|
72
|
-
|
|
73
|
-
lookup = set()
|
|
74
|
-
for name in dir(expr):
|
|
75
|
-
if not name.startswith("_"):
|
|
76
|
-
try:
|
|
77
|
-
m = getattr(expr, name)
|
|
78
|
-
except AttributeError: # may raise for @property methods
|
|
79
|
-
continue
|
|
80
|
-
if callable(m):
|
|
81
|
-
# add function signature (argument names only) to the lookup
|
|
82
|
-
# as a _possible_ candidate for expression-dispatch
|
|
83
|
-
m = _undecorated(m)
|
|
84
|
-
args = m.__code__.co_varnames[: m.__code__.co_argcount]
|
|
85
|
-
lookup.add((namespace, name, args))
|
|
86
|
-
return lookup
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def _undecorated(function: Callable[P, T]) -> Callable[P, T]:
|
|
90
|
-
"""Return the given function without any decorators."""
|
|
91
|
-
while hasattr(function, "__wrapped__"):
|
|
92
|
-
function = function.__wrapped__
|
|
93
|
-
return function
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
def call_expr(func: SeriesMethod) -> SeriesMethod:
|
|
97
|
-
"""Dispatch Series method to an expression implementation."""
|
|
98
|
-
|
|
99
|
-
@wraps(func)
|
|
100
|
-
def wrapper(self: Any, *args: P.args, **kwargs: P.kwargs) -> Series:
|
|
101
|
-
s = wrap_s(self._s)
|
|
102
|
-
expr = F.col(s.name)
|
|
103
|
-
if (namespace := getattr(self, "_accessor", None)) is not None:
|
|
104
|
-
expr = getattr(expr, namespace)
|
|
105
|
-
f = getattr(expr, func.__name__)
|
|
106
|
-
return s.to_frame().select_seq(f(*args, **kwargs)).to_series()
|
|
107
|
-
|
|
108
|
-
# note: applying explicit '__signature__' helps IDEs (especially PyCharm)
|
|
109
|
-
# with proper autocomplete, in addition to what @functools.wraps does
|
|
110
|
-
setattr(wrapper, "__signature__", inspect.signature(func)) # noqa: B010
|
|
111
|
-
return wrapper
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def _is_empty_method(func: SeriesMethod) -> bool:
|
|
115
|
-
"""
|
|
116
|
-
Confirm that the given function has no implementation.
|
|
117
|
-
|
|
118
|
-
Definitions of empty:
|
|
119
|
-
|
|
120
|
-
- only has a docstring (body is empty)
|
|
121
|
-
- has no docstring and just contains 'pass' (or equivalent)
|
|
122
|
-
"""
|
|
123
|
-
fc = func.__code__
|
|
124
|
-
return (fc.co_code in _EMPTY_BYTECODE) and (
|
|
125
|
-
(len(fc.co_consts) == 2 and fc.co_consts[1] is None)
|
|
126
|
-
# account for optimized-out docstrings (eg: running 'python -OO')
|
|
127
|
-
or (sys.flags.optimize == 2 and fc.co_consts == (None,))
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
class _EmptyBytecodeHelper:
|
|
132
|
-
def __init__(self) -> None:
|
|
133
|
-
# generate bytecode for empty functions with/without a docstring
|
|
134
|
-
def _empty_with_docstring() -> None:
|
|
135
|
-
"""""" # noqa: D419
|
|
136
|
-
|
|
137
|
-
def _empty_without_docstring() -> None:
|
|
138
|
-
pass
|
|
139
|
-
|
|
140
|
-
self.empty_bytecode = (
|
|
141
|
-
_empty_with_docstring.__code__.co_code,
|
|
142
|
-
_empty_without_docstring.__code__.co_code,
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
def __contains__(self, item: bytes) -> bool:
|
|
146
|
-
return item in self.empty_bytecode
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
_EMPTY_BYTECODE = _EmptyBytecodeHelper()
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
def get_ffi_func(
|
|
153
|
-
name: str, dtype: PolarsDataType, obj: PySeries
|
|
154
|
-
) -> Callable[..., Any] | None:
|
|
155
|
-
"""
|
|
156
|
-
Dynamically obtain the proper FFI function/ method.
|
|
157
|
-
|
|
158
|
-
Parameters
|
|
159
|
-
----------
|
|
160
|
-
name
|
|
161
|
-
function or method name where dtype is replaced by <>
|
|
162
|
-
for example
|
|
163
|
-
"call_foo_<>"
|
|
164
|
-
dtype
|
|
165
|
-
polars dtype.
|
|
166
|
-
obj
|
|
167
|
-
Object to find the method for.
|
|
168
|
-
|
|
169
|
-
Returns
|
|
170
|
-
-------
|
|
171
|
-
callable or None
|
|
172
|
-
FFI function, or None if not found.
|
|
173
|
-
"""
|
|
174
|
-
ffi_name = dtype_to_ffiname(dtype)
|
|
175
|
-
fname = name.replace("<>", ffi_name)
|
|
176
|
-
return getattr(obj, fname, None)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def _with_no_check_length(func: Callable[..., Any]) -> Any:
|
|
180
|
-
from polars._plr import check_length
|
|
181
|
-
|
|
182
|
-
# Catch any error so that we can be sure that we always restore length checks
|
|
183
|
-
try:
|
|
184
|
-
check_length(False)
|
|
185
|
-
result = func()
|
|
186
|
-
check_length(True)
|
|
187
|
-
except Exception:
|
|
188
|
-
check_length(True)
|
|
189
|
-
raise
|
|
190
|
-
else:
|
|
191
|
-
return result
|