From ebd8700c2c18bcbea79a72c32da958ac9b33418d Mon Sep 17 00:00:00 2001 From: Sparks29032 Date: Sat, 28 Feb 2026 08:30:48 -0800 Subject: [PATCH 1/2] skip none inputs --- src/diffpy/morph/morphpy.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/diffpy/morph/morphpy.py b/src/diffpy/morph/morphpy.py index bac6eee8..a5563828 100644 --- a/src/diffpy/morph/morphpy.py +++ b/src/diffpy/morph/morphpy.py @@ -12,14 +12,16 @@ def get_args(parser, params, kwargs): inputs.append(f"--{key}") inputs.append(f"{value}") for key, value in kwargs.items(): - key = key.replace("_", "-") - if key == "exclude": - for param in value: + if value is not None: + key = key.replace("_", "-") + if key == "exclude": + for param in value: + if param: + inputs.append(f"--{key}") + inputs.append(f"{param}") + else: inputs.append(f"--{key}") - inputs.append(f"{param}") - else: - inputs.append(f"--{key}") - inputs.append(f"{value}") + inputs.append(f"{value}") (opts, pargs) = parser.parse_args(inputs) return opts, pargs From 0bcda10d9206f6baec8abb33dc16161f62d98e6b Mon Sep 17 00:00:00 2001 From: Sparks29032 Date: Sat, 28 Feb 2026 08:50:44 -0800 Subject: [PATCH 2/2] Add tests --- news/allow_none.rst | 23 +++++++++++++++++++++++ src/diffpy/morph/morphpy.py | 17 +++++++++-------- tests/test_morphpy.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 news/allow_none.rst diff --git a/news/allow_none.rst b/news/allow_none.rst new file mode 100644 index 00000000..24df1b41 --- /dev/null +++ b/news/allow_none.rst @@ -0,0 +1,23 @@ +**Added:** + +* + +**Changed:** + +* + +**Deprecated:** + +* + +**Removed:** + +* + +**Fixed:** + +* In morphpy, when a parameter is set to None, it will not be used as an option. + +**Security:** + +* diff --git a/src/diffpy/morph/morphpy.py b/src/diffpy/morph/morphpy.py index a5563828..862d388d 100644 --- a/src/diffpy/morph/morphpy.py +++ b/src/diffpy/morph/morphpy.py @@ -27,14 +27,6 @@ def get_args(parser, params, kwargs): def __get_morph_opts__(parser, scale, stretch, smear, plot, **kwargs): - # Check for Python-specific options - python_morphs = ["funcy", "funcx", "funcxy"] - pymorphs = {} - for pmorph in python_morphs: - if pmorph in kwargs: - pmorph_value = kwargs.pop(pmorph) - pymorphs.update({pmorph: pmorph_value}) - # Special handling of parameters with dashes kwargs_copy = kwargs.copy() kwargs = {} @@ -44,6 +36,15 @@ def __get_morph_opts__(parser, scale, stretch, smear, plot, **kwargs): new_key = key.replace("_", "-") kwargs.update({new_key: kwargs_copy[key]}) + # Check for Python-specific options + python_morphs = ["funcy", "funcx", "funcxy"] + pymorphs = {} + for pmorph in python_morphs: + if pmorph in kwargs: + pmorph_value = kwargs.pop(pmorph) + if pmorph_value is not None: + pymorphs.update({pmorph: pmorph_value}) + # Special handling of store_true and store_false parameters opts_storing_values = [ "verbose", diff --git a/tests/test_morphpy.py b/tests/test_morphpy.py index 621f844d..9ffc9589 100644 --- a/tests/test_morphpy.py +++ b/tests/test_morphpy.py @@ -116,6 +116,38 @@ def test_morph_opts(self, setup_morph): else: assert getattr(opts, opt) + # Check that morphs can be set as None + kwargs = { + "hshift": None, + "vshift": None, + "squeeze": None, + "funcx": None, + "funcy": None, + "funcxy": None, + "verbose": None, + "addpearson": None, + "apply": None, + "exclude": None, + "reverse": None, + "get_diff": None, + "multiple_morphs": None, + "multiple_targets": None, + } + kwargs_copy = kwargs.copy() + opts, pymorphs = __get_morph_opts__( + self.parser, + scale=1, + stretch=0, + smear=0, + plot=False, + **kwargs_copy, + ) + for opt in kwargs: + try: + assert not getattr(opts, opt) + except AttributeError: + pass + def test_morph(self, setup_morph): morph_results = {} morph_file = self.testfiles[0]