Julia、JavaScript、Lua、その他の言語でのPythonの「withas」ステートメント

with asPythonの機能を理解するための私にとっての課題の1つは、Python言語の限界をより深く理解していない限り、その必要性は明らかではありません。

たとえば、Ruby、Julia、Lua、Go、JavaScript、またはSwiftの開発者は、このステートメントを追加する必要はありません。何故ですか?

問題の中心にあるのは、多くのPython開発者が大切にしている機能です。コードブロックを示すためのインデントの使用です。

JavaScriptで私は例えば書くことができます

openfile('foobar.txt', function(file) {
  // called after file has been opened
  // file is a handle to the open file
  read_data(file)
  ...
});

openfile("foobar.txt", function(file)
  -- called after file has been opened
  -- file is a handle to the open file
  read_data(file)
  ...
end)

openfile("foobar.txt", def (file):
  # called after file has been opened
  # file is a handle to the open file
  read_data(file)
  ...

これは、インデントの変更ではなく、コードのブロックの終わりを示すシンボルを持つことの利点を示しています。

リソースの割り当てとクリーンアップのためのクロージャ付きの高階関数の使用

インラインマルチラインクロージャにわかりやすい構文を使用することの利点の詳細を少し見てみましょう。JavaScript、Lua、その他の多くの言語でも同様に機能しますが、Juliaのコード例を使用して説明します。

function openfile(callback, filename::String)
		file = open(filename)
    callback(file)
    close(file)
end

openfile(file -> print(readline(file)), "foobar.txt")

openfile("foobar.txt") do file
		print(readline(file))
end

ファイルを開いたり閉じたりするこの方法の利点は、ファイルを閉じることを忘れないことです。

Pythonソリューション

説明したように、Pythonで同じ構文を実現することは困難です。このようwith-asに発明されました。前の例がPythonでどのように実装されるかを示しましょう。

class openfile:
   def __init_(self, filename):
       self.filename
   def __enter__(self):
       self.file =  open(self.filename)
       return file
   def __exit__(self, exc_type, exc_val, exc_tb):
       close(self.file)

このクラスを使用して、次の方法でファイルを開いたり、ファイルから読み取ったりできます。

with openfile("foobar.txt") as file:
  print(readline(file))

  1. 最初にopenfileクラスのコンストラクターが呼び出され、開きたいファイルの名前が格納されます。
  2. openfileクラスのインスタンスがwith-asコンストラクトに渡され、その__enter__メソッドが呼び出されます。希望する資源を獲得することになっています。この場合のファイルハンドル。
  3. 返されたオブジェクトは、の引数になりasます。したがってas file、から返されるオブジェクトを参照します__enter__。名前は一致する必要はありません。as foobar代わりに書くこともできます。
  4. with-asブロック内のすべてのコードが実行されると、Pythonは__exit__リソースを解放するために呼び出します。これは、例外がスローされた場合にも呼び出されます。

サブクラス化またはデコレータの使用により、これらのコンテキストマネージャクラスを作成する方法にはさまざまなバリエーションがあります。

提案された投稿

ドメイン名に関する情報の検索

Brian P. Hogan 著『Small, Sharp Software Tools』からの抜粋

ドメイン名に関する情報の検索

facebook.com にリクエストを送信すると、コンピュータはドメイン名を検索してそのドメイン名を IP アドレスに変換し、コンピュータが接続できるようにします。

UI デザインにおける D ワードと L ワード。言語は重要です。人種差別をしないでください。

UI デザインにおける D ワードと L ワード。言語は重要です。人種差別をしないでください。

私たちの言語は、私たちの思考、態度、行動を形作る強力なツールです。一見無害に見える用語であっても、有害な偏見や固定観念を永続させる可能性があります。

関連記事

パスワードはもう不要 — パスキーがパスワードをどのように置き換えるか

パスワードはもう不要 — パスキーがパスワードをどのように置き換えるか

曖昧さを避けるために、次の用語が使用されます。認証者; ログイン Web サイトの作成に使用されている携帯電話。ユーザーがログイン要求サービスを行うために使用している Web サイトまたはアプリケーション。特定のサービスを提供するベンダー。例:

カウボーイの嘘

巨大企業はいかにしてアメリカ国民にひどい嘘を売ったのか

カウボーイの嘘

西のなだらかな丘陵地帯では、太陽の最初の光が平原の曇った草を照らす、まばゆいばかりの金色の朝です。真っ黒で巨大な穏やかなアンガス牛の群れが日の出を背景にシルエットを描き、誰もがよく知っている場所へ人里離れた道を進んでいます。朝食バー。

危険な会話

危険な会話

私たちがこの地球上で繁栄し続けたいのであれば、危険な会話をしなければなりません。私たちがこれまでやってきたこと、現在行っていること、そして現在継続して行う予定の(または計画している)ことに挑戦するものです。

「マリアナ海溝の公開: 深淵の恐るべき隠された真実を明らかにする」

「マリアナ海溝の公開: 深淵の恐るべき隠された真実を明らかにする」

はじめに:勇敢な読者の皆さん、地球の最も暗い深みへ私たちを導く旅へようこそ。このブログでは、マリアナ海溝の謎に満ちた世界を掘り下げ、その隠された秘密を明らかにし、その表面の下にある骨も凍るような真実を明らかにします。