From 8b94b306291aab39ce798093ce7905bdfafa573c Mon Sep 17 00:00:00 2001 From: Miguel Monteiro Date: Thu, 30 Jan 2025 18:13:05 +0000 Subject: [PATCH 1/5] feat: support for partial and partialmethod --- jsonargparse/_parameter_resolvers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jsonargparse/_parameter_resolvers.py b/jsonargparse/_parameter_resolvers.py index 5fb98bd1..085995d8 100644 --- a/jsonargparse/_parameter_resolvers.py +++ b/jsonargparse/_parameter_resolvers.py @@ -8,7 +8,7 @@ from contextlib import contextmanager, suppress from contextvars import ContextVar from copy import deepcopy -from functools import partial +from functools import partial, partialmethod from importlib import import_module from types import MethodType from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, Union @@ -101,6 +101,8 @@ def is_method(attr) -> bool: attr ) +def is_partial_method(attr) -> bool: + return isinstance(attr, partialmethod) or isinstance(attr, partial) def is_property(attr) -> bool: return isinstance(attr, property) @@ -509,6 +511,8 @@ def get_component_and_parent( component = getattr(function_or_class, "__new__") elif is_method(attr): component = attr + elif is_partial_method(attr): + component = getattr(function_or_class, method_or_property) elif is_property(attr): component = attr.fget elif isinstance(attr, classmethod): From c440f4c6ec2a24c234ef8825ddf6f4c7993dde12 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:20:35 +0000 Subject: [PATCH 2/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- jsonargparse/_parameter_resolvers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jsonargparse/_parameter_resolvers.py b/jsonargparse/_parameter_resolvers.py index 085995d8..abcfaf8a 100644 --- a/jsonargparse/_parameter_resolvers.py +++ b/jsonargparse/_parameter_resolvers.py @@ -101,9 +101,11 @@ def is_method(attr) -> bool: attr ) + def is_partial_method(attr) -> bool: return isinstance(attr, partialmethod) or isinstance(attr, partial) + def is_property(attr) -> bool: return isinstance(attr, property) From 828a7c3ababd9026ae0bf01545c916d9ea9021df Mon Sep 17 00:00:00 2001 From: Miguel Monteiro Date: Fri, 31 Jan 2025 15:35:50 +0000 Subject: [PATCH 3/5] feat: support for partialmethods --- CHANGELOG.rst | 3 ++- jsonargparse/_parameter_resolvers.py | 2 +- jsonargparse_tests/test_parameter_resolvers.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 38345d18..40da8d45 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -20,7 +20,8 @@ Added - Experimental support for sub-classing ``ArgumentParser`` to customize ``add_argument`` (`#661 `__). - +- Support for partialmethods (`#664 + `__). v4.36.0 (2025-01-17) -------------------- diff --git a/jsonargparse/_parameter_resolvers.py b/jsonargparse/_parameter_resolvers.py index abcfaf8a..1e7679b0 100644 --- a/jsonargparse/_parameter_resolvers.py +++ b/jsonargparse/_parameter_resolvers.py @@ -103,7 +103,7 @@ def is_method(attr) -> bool: def is_partial_method(attr) -> bool: - return isinstance(attr, partialmethod) or isinstance(attr, partial) + return isinstance(attr, partialmethod) def is_property(attr) -> bool: diff --git a/jsonargparse_tests/test_parameter_resolvers.py b/jsonargparse_tests/test_parameter_resolvers.py index 368e58fe..e45f4695 100644 --- a/jsonargparse_tests/test_parameter_resolvers.py +++ b/jsonargparse_tests/test_parameter_resolvers.py @@ -4,6 +4,7 @@ import inspect import xml.dom from calendar import Calendar +from functools import partialmethod from random import shuffle from typing import Any, Callable, Dict, List, Optional, Union from unittest.mock import patch @@ -33,6 +34,8 @@ def method_a(self, pma1: int, pma2: float, kma1: str = "x"): kma1: help for kma1 """ + partial_method_a = partialmethod(method_a, pma1=1, pma2=0.5) + class ClassB(ClassA): def __init__(self, pkb1: str, kb1: int = 3, kb2: str = "4", **kwargs): @@ -899,6 +902,14 @@ def test_get_params_some_ignored(): assert_params(get_params(func_given_kwargs), ["p", "p1"], help=False) +# test partial method +def test_partialmethod(): + ClassA.partial_method_a = partialmethod(ClassA.method_a, pma1=1, pma2=0.5) + assert_params(get_params(ClassA, "partial_method_a"), ["pma1", "pma2", "kma1"]) + with source_unavailable(): + assert_params(get_params(ClassA, "partial_method_a"), ["pma1", "pma2", "kma1"]) + + # unsupported cases From ba941d45cfca2770541d364970a563a1da42b636 Mon Sep 17 00:00:00 2001 From: Miguel Monteiro Date: Mon, 3 Feb 2025 09:02:04 +0000 Subject: [PATCH 4/5] fix: remove redundant comment --- jsonargparse_tests/test_parameter_resolvers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/jsonargparse_tests/test_parameter_resolvers.py b/jsonargparse_tests/test_parameter_resolvers.py index e45f4695..97229fda 100644 --- a/jsonargparse_tests/test_parameter_resolvers.py +++ b/jsonargparse_tests/test_parameter_resolvers.py @@ -902,7 +902,6 @@ def test_get_params_some_ignored(): assert_params(get_params(func_given_kwargs), ["p", "p1"], help=False) -# test partial method def test_partialmethod(): ClassA.partial_method_a = partialmethod(ClassA.method_a, pma1=1, pma2=0.5) assert_params(get_params(ClassA, "partial_method_a"), ["pma1", "pma2", "kma1"]) From 66b7ef634b29396e1f199354dc61861517a88803 Mon Sep 17 00:00:00 2001 From: Mauricio Villegas <5780272+mauvilsa@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:14:18 +0100 Subject: [PATCH 5/5] Update CHANGELOG.rst --- CHANGELOG.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 40da8d45..6d2cace7 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -20,8 +20,8 @@ Added - Experimental support for sub-classing ``ArgumentParser`` to customize ``add_argument`` (`#661 `__). -- Support for partialmethods (`#664 - `__). +- Support for partialmethods (`#665 + `__). v4.36.0 (2025-01-17) --------------------