我正在通过I2C总线与某些硬件通信。
每隔很多次,由于总线很忙,所以有一个例外,因此我目前正在使用重试的循环来处理它,但是有很多代码重复,我想整理一下。
因此,我试图编写一个装饰器函数以将各种函数传递给
作为示例,此命令初始化总线:
i2c = busio.I2C(board.SCL,board.SDA)
这是我写的装饰器:
def try_decorator(func,name):
MAX_TRIES = 5
i = 1
n = name
while True:
try:
func()
except Exception as e:
print(f'retry {i} for {n}')
i += 1
if i == MAX_TRIES:
print(f'max retries of {MAX_TRIES} reached for {n},with error: {e}')
break
continue
break
然后我尝试将上述行作为部分传递给它:
i2c = try_decorator(partial(busio.I2C,board.SCL,board.SDA),'i2c init')
,但是当我尝试将i2c传递给下一个函数'NoneType' object has no attribute 'try_lock'
时出现异常,我认为这意味着该部分实际上并未正确初始化总线。我也尝试作为lambda和函数使用,但得到了相似的结果。
该如何解决此问题并使我的代码尽可能简单?
此外,我尝试在装饰器中尝试使用func。 name 来代替函数,而不是将字符串作为name
作为arg(以跟踪异常)作为arg传递(以跟踪异常)部分,但会给出一个错误,似乎是在试图获取I2C对象的名称。
编辑:我已经按照BigBro对以下内容的回答更新了代码,但是在将i2c对象传递给我的下一个函数时仍然出现错误(如果我不使用装饰器就不会出现此错误)。
def retry(f):
MAX_TRIES = 5
def wrapped(*args,**kwargs):
for i in range(MAX_TRIES):
try:
res = f(*args,**kwargs)
return res
except IOError as e:
print(f'retry {i} for {f.__name__},with error: {e}')
print(f'max retries of {MAX_TRIES} reached for {f.__name__},with error: {e}')
return wrapped
i2c = retry(busio.I2C(board.SCL,board.SDA))
drv = adafruit_drv2605.DRV2605(i2c)
'function' object has no attribute 'try_lock'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。