From c4e2fc90385fb7514376ba519d173191ec840fb7 Mon Sep 17 00:00:00 2001 From: Ryan Henning Date: Sat, 18 Jan 2025 17:35:20 -0600 Subject: [PATCH] Better get_name --- src/lasagna/util.py | 18 ++++++++++++++++-- tests/test_util.py | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/lasagna/util.py b/src/lasagna/util.py index 4148ca3..d4a44e7 100644 --- a/src/lasagna/util.py +++ b/src/lasagna/util.py @@ -172,9 +172,23 @@ def exponential_backoff_retry_delays( return [min(d, max_delay) for d in delay_list] +def _has_own_str_method(obj: Any) -> bool: + if not hasattr(obj, '__class__'): + return False + class_str = obj.__class__.__str__ + superclass_str = obj.__class__.__base__.__str__ + return class_str is not superclass_str + + def get_name(obj: Any) -> str: - name = str(obj.__name__) if hasattr(obj, '__name__') else str(obj) - return name + if hasattr(obj, '__name__'): + return str(obj.__name__) + elif _has_own_str_method(obj): + return str(obj) + elif hasattr(obj, '__class__'): + return get_name(obj.__class__) + else: + return str(obj) class HashAlgorithm(Protocol): diff --git a/tests/test_util.py b/tests/test_util.py index 13d4251..03e1bbf 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -436,10 +436,14 @@ class class_with_str_method: def __str__(self) -> str: return 'Hi!' +class class_with_no_str_method: + pass + def test_get_name(): assert get_name(regular_function) == 'regular_function' assert get_name(async_regular_function) == 'async_regular_function' assert get_name(class_with_str_method()) == 'Hi!' + assert get_name(class_with_no_str_method()) == 'class_with_no_str_method' def test_recursive_hash():