def retry_on_exception(max_retries: int = 5, delay_interval: int = 20): def decorator(func): @wraps(func) def with_retry(*args, **kwargs): nonlocal max_retries, delay_interval,传参进去的东西也算非局部变量吗
时间: 2024-03-29 13:35:15 浏览: 66
是的,传入函数的参数也可以被视为非局部变量。在这段代码中,使用 `nonlocal` 关键字声明了 `max_retries` 和 `delay_interval` 为 nonlocal 变量,因此可以在内部函数 `with_retry` 中修改它们的值。当你在传参时,传入的参数值会覆盖默认值,从而改变 nonlocal 变量的值,因此在函数执行过程中的任何时刻,`max_retries` 和 `delay_interval` 都可能被修改。
相关问题
def retry_on_exception(max_retries: int = 10, delay_interval: int = 20): def decorator(func): @wraps(func) def with_retry(*args, **kwargs): nonlocal max_retries, delay_interval retried_times = 0 while max_retries > retried_times: try: return func(*args, **kwargs) except (Exception) as e: retried_times += 1 print("retry times: {}".format(str(retried_times))) time.sleep(delay_interval) continue return func(*args, **kwargs) return with_retry return decorator
这段代码是一个装饰器函数,用于对被装饰的函数进行异常重试。其中,max_retries参数表示最大重试次数,默认为10次;delay_interval参数表示重试间隔时间,默认为20秒。当被装饰的函数发生异常时,会进行重试,直到达到最大重试次数或者成功执行为止。在每次重试时,会打印当前重试次数,并暂停一段时间后再次执行被装饰的函数。最终返回被装饰的函数的执行结果。
<FrameLayout android:id="@+id/fl_retry" android:layout_width="match_parent" android:layout_height="150dp" android:layout_centerInParent="true" android:layout_gravity="bottom" android:layout_margin="10dp" android:background="@drawable/bnav_tab_background" android:visibility="gone" tools:visibility="visible"> <LinearLayout android:id="@+id/ll_retry" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bnav_shape_du" android:gravity="center" android:text="@string/du" android:textColor="#d2d2d2" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="@string/retry_text" android:textColor="#3385ff" /> </LinearLayout> </FrameLayout> 以上代码出现 This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view 帮我改一下
<Layout
android:id="@+id/fl_retry"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_centerInParent="true"
android:layout_margin="10dp"
android:visibility="gone"
tools:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bnav_shape_du"
android:gravity="center"
android:text="@string/du"
android:textColor="#d2d2d2" />
<TextView
android:id="@+id/tv_retry_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/retry_text"
android:textColor="#3385ff" />
</FrameLayout>
根据警告信息,将背景属性转移到其他视图上,这里我将背景属性移植到了第一个 TextView 上,同时将第二个 TextView 加入了 ID,方便在代码中引用。
阅读全文