This is an automated email from the ASF dual-hosted git repository.
ruifengz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new 5932f11fb916 [SPARK-54990][PYTHON] Fix how classproperty is
implemented in session.py
5932f11fb916 is described below
commit 5932f11fb91606606234f486f289be1358b1d829
Author: Tian Gao <[email protected]>
AuthorDate: Wed Jan 21 17:45:29 2026 +0800
[SPARK-54990][PYTHON] Fix how classproperty is implemented in session.py
### What changes were proposed in this pull request?
Implement `classproperty` correctly with descriptor.
### Why are the changes needed?
The current implementation is unnecessarily complicated. It does not need
to inherit `property` and use it's methods. Also it confuses type checker.
### Does this PR introduce _any_ user-facing change?
No
### How was this patch tested?
Need to pass CI
### Was this patch authored or co-authored using generative AI tooling?
No
Closes #53772 from gaogaotiantian/fix-session-class-property.
Authored-by: Tian Gao <[email protected]>
Signed-off-by: Ruifeng Zheng <[email protected]>
---
python/pyspark/sql/session.py | 33 +++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/python/pyspark/sql/session.py b/python/pyspark/sql/session.py
index 0d5353f0fb32..0fd84c2f4886 100644
--- a/python/pyspark/sql/session.py
+++ b/python/pyspark/sql/session.py
@@ -24,13 +24,16 @@ from threading import RLock
from types import TracebackType
from typing import (
Any,
+ Callable,
ClassVar,
Dict,
Iterable,
+ Generic,
List,
Optional,
Tuple,
Type,
+ TypeVar,
Union,
Set,
cast,
@@ -136,7 +139,10 @@ def _monkey_patch_RDD(sparkSession: "SparkSession") ->
None:
RDD.toDF = toDF # type: ignore[method-assign]
-class classproperty(property):
+T = TypeVar("T")
+
+
+class classproperty(Generic[T]):
"""Same as Python's @property decorator, but for class attributes.
Examples
@@ -161,12 +167,13 @@ class classproperty(property):
True
"""
- def __get__(self, instance: Any, owner: Any = None) ->
"SparkSession.Builder":
- # The "type: ignore" below silences the following error from mypy:
- # error: Argument 1 to "classmethod" has incompatible
- # type "Optional[Callable[[Any], Any]]";
- # expected "Callable[..., Any]" [arg-type]
- return classmethod(self.fget).__get__(None, owner)() # type: ignore
+ def __init__(self, fget: Callable[[type], T]) -> None:
+ self.fget = fget
+
+ def __get__(self, instance: Any, owner: Optional[type]) -> T:
+ if owner is None:
+ owner = type(instance)
+ return self.fget(owner)
class SparkSession(SparkConversionMixin):
@@ -603,12 +610,14 @@ class SparkSession(SparkConversionMixin):
# SPARK-47544: Explicitly declaring this as an identifier instead of a
method.
# If changing, make sure this bug is not reintroduced.
- builder: Builder = classproperty(lambda cls: cls.Builder()) # type: ignore
- """Creates a :class:`Builder` for constructing a :class:`SparkSession`.
+ @classproperty
+ def builder(cls: Type["SparkSession"]) -> "Builder": # type: ignore[misc]
+ """Creates a :class:`Builder` for constructing a :class:`SparkSession`.
- .. versionchanged:: 3.4.0
- Supports Spark Connect.
- """
+ .. versionchanged:: 3.4.0
+ Supports Spark Connect.
+ """
+ return cls.Builder()
_instantiatedSession: ClassVar[Optional["SparkSession"]] = None
_activeSession: ClassVar[Optional["SparkSession"]] = None
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]