这里有几种方法可以使用.
鸭打字
由于Python是duck typed,您可以简单地做如下(这似乎是通常建议的方式):
try:
data = data.decode()
except AttributeError:
pass
但是,您可以使用hasattr,但是可能会很好.这当然是假定给定对象的.decode()方法返回一个字符串,并且没有讨厌的副作用.
我个人建议使用异常或者是hasattr方法,不管你使用什么都取决于你.
使用str()
这种方法是不常见的,但是有可能:
data = str(data, "utf-8")
其他编码是允许的,就像缓冲协议的.decode()一样.您还可以传递第三个参数来指定错误处理.
单分派通用函数(Python 3.4)
Python 3.4及以上版本包括一个名为单调派通用函数的漂亮功能,通过functools.singledispatch.这有点更详细,但也更为明确:
def func(data):
# This is the generic implementation
data = data.decode()
...
@func.register(str)
def _(data):
# data will already be a string
...
如果你这样选择,你也可以为bytearray和bytes对象制作特殊的处理程序.
当心:单一调度功能只适用于第一个参数!这是一个有意图的功能,见PEP 433.