我有一个返回 UTF-8 编码字符串的设备。我只能逐字节读取,并且读取以值 0x00 的字节终止。
我正在为其他人创建一个 Python 2.7 函数来访问我的设备并返回字符串。
在以前的设计中,当设备只返回 ASCII 时,我在循环中使用了它:
x = read_next_byte()
if x == 0:
break
my_string += chr(x)
Run Code Online (Sandbox Code Playgroud)
其中 x 是从设备读取的最新字节值。
现在设备可以返回 UTF-8 编码的字符串,但我不确定如何将获取的字节转换回 UTF-8 编码的字符串/unicode。
chr(x)可以理解的是,当 x>127 时会导致错误,所以我认为 usingunichr(x)可能有效,但假设传递的值是完整的 unicode 字符值,但我只有 0-255 的一部分。
那么如何将从设备返回的字节转换为可在 Python 中使用的字符串,并且仍然处理完整的 UTF-8 字符串?
同样,如果在 Python 中给我一个 UTF-8 字符串,我如何将其分解为单个字节以发送到我的设备并仍然保持 UTF-8?
我是 Python 新手,有很多函数可以在某些硬件上执行各种任务。每个函数都有不同数量的参数和返回值。
我想制作一种通用的“重试”包装函数,它将捕获我的任何函数的异常并执行一些错误处理(例如重试任务)。
据我了解,我应该能够使用装饰器函数作为每个函数的通用包装器。这似乎有效,但我似乎无法真正从装饰器函数中调用的函数中获得任何异常。
我查看了各种示例并得出了以下结论:
def retry(function):
def _retry(*args, **kwargs):
try:
reply = function(*args, **kwargs)
print "reply: ", reply
return reply
except PDError as msg:
print "_retry", msg
except:
print "_retry: another error"
return _retry
Run Code Online (Sandbox Code Playgroud)
然后我使用我的函数之一的名称来调用它:
value = retry(pd.command_get_parameter(0x00))
Run Code Online (Sandbox Code Playgroud)
它似乎调用了我的函数并正确返回,但我的重试函数中从未捕获异常。所以我无法处理错误并重试。
我也尝试过这个:
from functools import wraps
def retry(function):
@wraps(function)
def _retry(*args, **kwargs):
.....
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么,或者这是否是最好的方法。有人对如何做到这一点有建议吗?我真的不想为每个主要功能创建单独的“重试”功能。