diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 1d038747b..1c38caa25 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -278,6 +278,15 @@ def object_description(object): template = "{%s}" if PY3 else "set([%s])" return template % ", ".join(object_description(x) for x in sorted_values) + if isinstance(object, frozenset): + try: + sorted_values = sorted(object) + except TypeError: + pass # Cannot sort frozenset values, fall back to generic repr + else: + template = "frozenset({%s})" if PY3 else "frozenset([%s])" + return template % ", ".join(object_description(x) + for x in sorted_values) try: s = repr(object) except Exception: diff --git a/tests/test_util_inspect.py b/tests/test_util_inspect.py index 99033fb6e..7266d4bbf 100644 --- a/tests/test_util_inspect.py +++ b/tests/test_util_inspect.py @@ -391,6 +391,24 @@ def test_set_sorting_fallback(): assert description in ("set([1, None])", "set([None, 1])") +def test_frozenset_sorting(): + frozenset_ = frozenset("gfedcba") + description = inspect.object_description(frozenset_) + if PY3: + assert description == "frozenset({'a', 'b', 'c', 'd', 'e', 'f', 'g'})" + else: + assert description == "frozenset(['a', 'b', 'c', 'd', 'e', 'f', 'g'])" + + +def test_frozenset_sorting_fallback(): + frozenset_ = frozenset((None, 1)) + description = inspect.object_description(frozenset_) + if PY3: + assert description in ("frozenset({1, None})", "frozenset({None, 1})") + else: + assert description in ("frozenset([1, None])", "frozenset([None, 1])") + + def test_dict_customtype(): class CustomType(object): def __init__(self, value):