Decodificando si no es unicode

Quiero que mi función tome un argumento que podría ser un objeto unicode o una cadena codificada utf-8. Dentro de mi función, quiero convertir el argumento a unicode. Tengo algo como esto:

def myfunction(text):
    if not isinstance(text, unicode):
        text = unicode(text, 'utf-8')

    ...

¿Es posible evitar el uso de isinstance? Estaba buscando algo más amigable para tipear patos.

Durante mis experimentos con la decodificación, me he encontrado con varios comportamientos extraños de Python. Por ejemplo:

>>> u'hello'.decode('utf-8')
u'hello'
>>> u'cer\xf3n'.decode('utf-8')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in po
sition 3: ordinal not in range(128)

O

>>> u'hello'.decode('utf-8')
u'hello' 12:11
>>> unicode(u'hello', 'utf-8')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: decoding Unicode is not supported

Por cierto. Estoy usando Python 2.6

Respuestas a la pregunta(2)

Su respuesta a la pregunta