ホームページ バックエンド開発 Python チュートリアル Python 関数クロージャを使用する際に注意すべき問題を説明する例

Python 関数クロージャを使用する際に注意すべき問題を説明する例

Jul 21, 2016 pm 02:53 PM
python 関数 閉鎖

昨日、暗闇の中で陽の指の力の10%でキーボードをつついてコーディングしていたとき、たまたま質問を受けて、私の良い仕事を奪われそうになりました。古代の力が漏れて人々に衝撃を与えました。あまりナンセンスではありませんが、栗から始めましょう(問題を説明するためだけに簡略化したものです):

リーリー

再試行デコレータのシンプルなバージョン。必要な変数はクロージャによって完全にキャプチャされ、ロジックは非常にシンプルかつ明確です。質問者によると、ロジックは正常のようですが、変数 retry_times が見つからない (未解決の参照) というエラー メッセージが報告され続けました。

そうです、注意深くチェックしてください。これはスコアリングの質問です。不変型のデータが操作される場合、クロージャ (retry_times、retry_wait) によってキャプチャされた変数は、クロージャによって参照される再試行関数のローカル変数と同等です。 Wrap_function のローカル関数では、新しいローカル変数が生成されますが、新しく生成されたローカル変数 retry_times は使用時に初期化される時間がないため、逆に変数が見つからないというメッセージが表示されます。よく使われました。

Python はダックタイピング プログラミング言語です。警告がある場合でも、できるだけ単純な関数を作成し、wrap_function ロジックにブレークポイントを置き、それぞれの値を確認します。変数を参照すると、問題をすぐに見つけることができます (直接実行すると、「UnboundLocalError: local variable 'retry_attempts' Referenced before assigning」というエラーも表示されます。少なくとも警告メッセージよりは便利です):

リーリー

この種の問題は、変更可能なコンテナーを使用して、使用したい不変型のデータをラップするだけで簡単に解決できます。たとえば、C#.net では、クロージャが検出されると、難読化された名前のクラスが自動的に作成されます。生成され、取得される値はクラスの属性として保存されるため、使用時に簡単に取得できるようになります。有名な Lao Zhao には、このトピックに関連していると思われる Lazy Evaluation に関する記事があるようです):

リーリー

出力:

リーリー

dict でラップした後、プログラムが期待どおりに正常に動作することが出力からわかります。実際、関数のクロージャの値からも再度確認できます。

リーリー
私がエンディング、PEACE!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Deepseek Xiaomiをダウンロードする方法 Deepseek Xiaomiをダウンロードする方法 Feb 19, 2025 pm 05:27 PM

Deepseek Xiaomiをダウンロードする方法

テンプレートのメリットとデメリットは何ですか? テンプレートのメリットとデメリットは何ですか? May 08, 2024 pm 03:51 PM

テンプレートのメリットとデメリットは何ですか?

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Jul 01, 2024 am 07:22 AM

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表

C++ラムダ式でクロージャを実装するにはどうすればよいですか? C++ラムダ式でクロージャを実装するにはどうすればよいですか? Jun 01, 2024 pm 05:50 PM

C++ラムダ式でクロージャを実装するにはどうすればよいですか?

Excel関数の公式の完全なコレクション Excel関数の公式の完全なコレクション May 07, 2024 pm 12:04 PM

Excel関数の公式の完全なコレクション

どうやって彼にdeepseekに尋ねますか どうやって彼にdeepseekに尋ねますか Feb 19, 2025 pm 04:42 PM

どうやって彼にdeepseekに尋ねますか

NET40とはどのようなソフトウェアですか? NET40とはどのようなソフトウェアですか? May 10, 2024 am 01:12 AM

NET40とはどのようなソフトウェアですか?

DeepSeekを検索する方法 DeepSeekを検索する方法 Feb 19, 2025 pm 05:18 PM

DeepSeekを検索する方法

See all articles