diff --git a/voluptuous/schema_builder.py b/voluptuous/schema_builder.py
index 6ad8758..f7427f8 100644
--- a/voluptuous/schema_builder.py
+++ b/voluptuous/schema_builder.py
@@ -1020,7 +1020,11 @@ class VirtualPathComponent(str):
 
 
 class Marker(object):
-    """Mark nodes for special treatment."""
+    """Mark nodes for special treatment.
+
+    `description` is an optional field, unused by Voluptuous itself, but can be used
+    introspected by any external tool, for example to generate schema documentation.
+    """
 
     def __init__(
         self,
diff --git a/voluptuous/validators.py b/voluptuous/validators.py
index a372afe..9951738 100644
--- a/voluptuous/validators.py
+++ b/voluptuous/validators.py
@@ -821,9 +821,15 @@ class In(object):
         except TypeError:
             check = True
         if check:
-            raise InInvalid(
-                self.msg or 'value must be one of {}'.format(sorted(self.container))
-            )
+            try:
+                raise InInvalid(
+                    self.msg or f'value must be one of {sorted(self.container)}'
+                )
+            except TypeError:
+                raise InInvalid(
+                    self.msg
+                    or f'value must be one of {sorted(self.container, key=str)}'
+                )
         return v
 
     def __repr__(self):
@@ -845,9 +851,15 @@ class NotIn(object):
         except TypeError:
             check = True
         if check:
-            raise NotInInvalid(
-                self.msg or 'value must not be one of {}'.format(sorted(self.container))
-            )
+            try:
+                raise NotInInvalid(
+                    self.msg or f'value must not be one of {sorted(self.container)}'
+                )
+            except TypeError:
+                raise NotInInvalid(
+                    self.msg
+                    or f'value must not be one of {sorted(self.container, key=str)}'
+                )
         return v
 
     def __repr__(self):

diff --git a/voluptuous/tests/tests.py b/voluptuous/tests/tests.py
index 05b7e8e..7286b31 100644
--- a/voluptuous/tests/tests.py
+++ b/voluptuous/tests/tests.py
@@ -79,19 +79,54 @@ def test_in():
     assert isinstance(ctx.value.errors[0], InInvalid)
 
 
+def test_in_unsortable_container():
+    """Verify that In works with unsortable container."""
+    schema = Schema({"type": In((int, str, float))})
+    schema({"type": float})
+    with pytest.raises(
+        MultipleInvalid,
+        match=(
+            r"value must be one of \[<class 'float'>, <class 'int'>, <class 'str'>\] for dictionary value "
+            r"@ data\['type'\]"
+        ),
+    ) as ctx:
+        schema({"type": 42})
+    assert len(ctx.value.errors) == 1
+    assert isinstance(ctx.value.errors[0], InInvalid)
+
+
 def test_not_in():
     """Verify that NotIn works."""
     schema = Schema({"color": NotIn(frozenset(["red", "blue", "yellow"]))})
     schema({"color": "orange"})
     with pytest.raises(
         MultipleInvalid,
-        match=r"value must not be one of \['blue', 'red', 'yellow'\] for dictionary value @ data\['color'\]",
+        match=(
+            r"value must not be one of \['blue', 'red', 'yellow'\] for dictionary "
+            r"value @ data\['color'\]"
+        ),
     ) as ctx:
         schema({"color": "blue"})
     assert len(ctx.value.errors) == 1
     assert isinstance(ctx.value.errors[0], NotInInvalid)
 
 
+def test_not_in_unsortable_container():
+    """Verify that NotIn works with unsortable container."""
+    schema = Schema({"type": NotIn((int, str, float))})
+    schema({"type": 42})
+    with pytest.raises(
+        MultipleInvalid,
+        match=(
+            r"value must not be one of \[<class 'float'>, <class 'int'>, "
+            r"<class 'str'>\] for dictionary value @ data\['type'\]"
+        ),
+    ) as ctx:
+        schema({"type": str})
+    assert len(ctx.value.errors) == 1
+    assert isinstance(ctx.value.errors[0], NotInInvalid)
+
+
 def test_contains():
     """Verify contains validation method."""
     schema = Schema({'color': Contains('red')})

Description argument not documented
The `description` argument for the `Marker` class (or any subclass) is not documented anywhere, so it's unclear what's allowed and how it affects the schema.
voluptuous/tests/tests.py::test_in_unsortable_container voluptuous/tests/tests.py::test_not_in_unsortable_container
voluptuous/tests/tests.py::test_new_required_test voluptuous/tests/tests.py::test_exact_sequence voluptuous/tests/tests.py::test_required voluptuous/tests/tests.py::test_extra_with_required voluptuous/tests/tests.py::test_iterate_candidates voluptuous/tests/tests.py::test_in voluptuous/tests/tests.py::test_not_in voluptuous/tests/tests.py::test_contains voluptuous/tests/tests.py::test_remove voluptuous/tests/tests.py::test_extra_empty_errors voluptuous/tests/tests.py::test_literal voluptuous/tests/tests.py::test_class voluptuous/tests/tests.py::test_email_validation voluptuous/tests/tests.py::test_email_validation_with_none voluptuous/tests/tests.py::test_email_validation_with_empty_string voluptuous/tests/tests.py::test_email_validation_without_host voluptuous/tests/tests.py::test_email_validation_with_bad_data[john@voluptuous.com>] voluptuous/tests/tests.py::test_email_validation_with_bad_data[john!@voluptuous.org!@($*!] voluptuous/tests/tests.py::test_fqdn_url_validation voluptuous/tests/tests.py::test_fqdn_url_validation_with_bad_data[without voluptuous/tests/tests.py::test_fqdn_url_validation_with_bad_data[None] voluptuous/tests/tests.py::test_fqdn_url_validation_with_bad_data[empty voluptuous/tests/tests.py::test_url_validation voluptuous/tests/tests.py::test_url_validation_with_bad_data[None] voluptuous/tests/tests.py::test_url_validation_with_bad_data[empty voluptuous/tests/tests.py::test_copy_dict_undefined voluptuous/tests/tests.py::test_sorting voluptuous/tests/tests.py::test_schema_extend voluptuous/tests/tests.py::test_schema_extend_overrides voluptuous/tests/tests.py::test_schema_extend_key_swap voluptuous/tests/tests.py::test_subschema_extension voluptuous/tests/tests.py::test_schema_extend_handles_schema_subclass voluptuous/tests/tests.py::test_equality voluptuous/tests/tests.py::test_equality_negative voluptuous/tests/tests.py::test_inequality voluptuous/tests/tests.py::test_inequality_negative voluptuous/tests/tests.py::test_repr voluptuous/tests/tests.py::test_list_validation_messages voluptuous/tests/tests.py::test_nested_multiple_validation_errors voluptuous/tests/tests.py::test_humanize_error voluptuous/tests/tests.py::test_fix_157 voluptuous/tests/tests.py::test_range_inside voluptuous/tests/tests.py::test_range_outside voluptuous/tests/tests.py::test_range_no_upper_limit voluptuous/tests/tests.py::test_range_no_lower_limit voluptuous/tests/tests.py::test_range_excludes_nan voluptuous/tests/tests.py::test_range_excludes_none voluptuous/tests/tests.py::test_range_excludes_string voluptuous/tests/tests.py::test_range_excludes_unordered_object voluptuous/tests/tests.py::test_clamp_inside voluptuous/tests/tests.py::test_clamp_above voluptuous/tests/tests.py::test_clamp_below voluptuous/tests/tests.py::test_clamp_invalid voluptuous/tests/tests.py::test_length_ok voluptuous/tests/tests.py::test_length_too_short voluptuous/tests/tests.py::test_length_too_long voluptuous/tests/tests.py::test_length_invalid voluptuous/tests/tests.py::test_equal voluptuous/tests/tests.py::test_unordered voluptuous/tests/tests.py::test_maybe voluptuous/tests/tests.py::test_maybe_accepts_msg voluptuous/tests/tests.py::test_maybe_returns_default_error voluptuous/tests/tests.py::test_schema_empty_list voluptuous/tests/tests.py::test_schema_empty_dict voluptuous/tests/tests.py::test_schema_empty_dict_key voluptuous/tests/tests.py::test_schema_decorator_match_with_args voluptuous/tests/tests.py::test_schema_decorator_unmatch_with_args voluptuous/tests/tests.py::test_schema_decorator_match_with_kwargs voluptuous/tests/tests.py::test_schema_decorator_unmatch_with_kwargs voluptuous/tests/tests.py::test_schema_decorator_match_return_with_args voluptuous/tests/tests.py::test_schema_decorator_unmatch_return_with_args voluptuous/tests/tests.py::test_schema_decorator_match_return_with_kwargs voluptuous/tests/tests.py::test_schema_decorator_unmatch_return_with_kwargs voluptuous/tests/tests.py::test_schema_decorator_return_only_match voluptuous/tests/tests.py::test_schema_decorator_return_only_unmatch voluptuous/tests/tests.py::test_schema_decorator_partial_match_called_with_args voluptuous/tests/tests.py::test_schema_decorator_partial_unmatch_called_with_args voluptuous/tests/tests.py::test_schema_decorator_partial_match_called_with_kwargs voluptuous/tests/tests.py::test_schema_decorator_partial_unmatch_called_with_kwargs voluptuous/tests/tests.py::test_number_validation_with_string voluptuous/tests/tests.py::test_number_validation_with_invalid_precision_invalid_scale voluptuous/tests/tests.py::test_number_validation_with_valid_precision_scale_yield_decimal_true voluptuous/tests/tests.py::test_number_when_precision_scale_none_yield_decimal_true voluptuous/tests/tests.py::test_number_when_precision_none_n_valid_scale_case1_yield_decimal_true voluptuous/tests/tests.py::test_number_when_precision_none_n_valid_scale_case2_yield_decimal_true voluptuous/tests/tests.py::test_number_when_precision_none_n_invalid_scale_yield_decimal_true voluptuous/tests/tests.py::test_number_when_valid_precision_n_scale_none_yield_decimal_true voluptuous/tests/tests.py::test_number_when_invalid_precision_n_scale_none_yield_decimal_true voluptuous/tests/tests.py::test_number_validation_with_valid_precision_scale_yield_decimal_false voluptuous/tests/tests.py::test_named_tuples_validate_as_tuples voluptuous/tests/tests.py::test_datetime voluptuous/tests/tests.py::test_date voluptuous/tests/tests.py::test_date_custom_format voluptuous/tests/tests.py::test_ordered_dict voluptuous/tests/tests.py::test_marker_hashable voluptuous/tests/tests.py::test_schema_infer voluptuous/tests/tests.py::test_schema_infer_dict voluptuous/tests/tests.py::test_schema_infer_list voluptuous/tests/tests.py::test_schema_infer_scalar voluptuous/tests/tests.py::test_schema_infer_accepts_kwargs voluptuous/tests/tests.py::test_validation_performance voluptuous/tests/tests.py::test_IsDir voluptuous/tests/tests.py::test_IsFile voluptuous/tests/tests.py::test_PathExists voluptuous/tests/tests.py::test_description voluptuous/tests/tests.py::test_SomeOf_min_validation voluptuous/tests/tests.py::test_SomeOf_max_validation voluptuous/tests/tests.py::test_self_validation voluptuous/tests/tests.py::test_any_error_has_path voluptuous/tests/tests.py::test_all_error_has_path voluptuous/tests/tests.py::test_match_error_has_path voluptuous/tests/tests.py::test_path_with_string voluptuous/tests/tests.py::test_path_with_list_index voluptuous/tests/tests.py::test_path_with_tuple_index voluptuous/tests/tests.py::test_path_with_integer_dict_key voluptuous/tests/tests.py::test_path_with_float_dict_key voluptuous/tests/tests.py::test_path_with_tuple_dict_key voluptuous/tests/tests.py::test_path_with_arbitrary_hashable_dict_key voluptuous/tests/tests.py::test_self_any voluptuous/tests/tests.py::test_self_all voluptuous/tests/tests.py::test_SomeOf_on_bounds_assertion voluptuous/tests/tests.py::test_comparing_voluptuous_object_to_str voluptuous/tests/tests.py::test_set_of_integers voluptuous/tests/tests.py::test_frozenset_of_integers voluptuous/tests/tests.py::test_set_of_integers_and_strings voluptuous/tests/tests.py::test_frozenset_of_integers_and_strings voluptuous/tests/tests.py::test_lower_util_handles_various_inputs voluptuous/tests/tests.py::test_upper_util_handles_various_inputs voluptuous/tests/tests.py::test_capitalize_util_handles_various_inputs voluptuous/tests/tests.py::test_title_util_handles_various_inputs voluptuous/tests/tests.py::test_strip_util_handles_various_inputs voluptuous/tests/tests.py::test_any_required voluptuous/tests/tests.py::test_any_required_with_subschema voluptuous/tests/tests.py::test_inclusive voluptuous/tests/tests.py::test_inclusive_defaults voluptuous/tests/tests.py::test_exclusive voluptuous/tests/tests.py::test_any_with_discriminant voluptuous/tests/tests.py::test_key1 voluptuous/tests/tests.py::test_key2 voluptuous/tests/tests.py::test_coerce_enum voluptuous/tests/tests.py::test_object voluptuous/tests/tests.py::test_exception