Update force_bytes and force_unicode to support casting objects to strings.

Review Request #13033 — Created May 10, 2023 and submitted — Latest diff uploaded




force_bytes() and force_unicode() now take a strings_only boolean
argument, which defaults to True for backwards-compatibility. When set
to False, these functions can take any arbitrary object and try to
turn it into a string.

force_bytes() will look for a __bytes__() dunder method, using that to
get the result, and then falling back on __str__().

force_unicode() will just look for __str__(). Since every object has
this, it will technically work with any object.

Typing has been updated to provide overloads based on the strings_only
parameter, helping to ensure callers receive type warnings if they
provide something other than a string without opting into

Unit tests have been added to cover this module.

Unit tests pass.

Tested this with some upcoming fixes for command output rendering.