Python の Pulumi: 補間の翻訳

Jul 19, 2024 am 12:36 AM

Pulumi in Python: Translating Interpolation

Pulumi は、インフラストラクチャをコードとして管理するための強力なツールであり、さまざまな言語に柔軟に対応できるため、開発者の間で人気の選択肢となっています。 Pulumi の TypeScript 構文は、出力と入力を処理するクリーンで便利な方法を提供しますが、これらの機能を Python に変換するのは困難な場合があります。この記事では、TypeScript での pulumi.interpolate の使用の微妙な違いと、Python で同様の機能を実現する方法について説明します。

プルミ補間

Pulumi の TypeScript 構文には、出力を連結するためのクリーンなアプローチがあります。これは、Python では使用できないタグ付きテンプレート リテラルを利用します。 Pulumi のリファレンス ドキュメントによると、 interpolate は concat に似ていますが、タグ付きのテンプレート式として使用するように設計されています。例:

// 'server' and 'loadBalancer' are both resources that expose [Output] properties.
let val: Output<string> = pulumi.interpolate `http://${server.hostname}:${loadBalancer.port}`
ログイン後にコピー

concat と同様に、${} の間の「プレースホルダー」は任意の入力にすることができます。つまり、Promise、Output、または単純な JavaScript 値にすることができます。

Pulumi の作業のほとんどを TypeScript で行ってきたので、新しいリソースに入力を渡す必要があるときは常に、pulumi.interpolate タグ付きテンプレート リテラルを頻繁に使用しました。あまり深く考えず、pulumi.concatやapplyと深く比較せずに使いまくってしまいました。しかし、Python で Pulumi を使い始めて pulumi.interpolate に手を伸ばしたときに、それが欠落していることに気付きました。

これにより、出力と入力の意味、および変換方法についてさらに深く理解することができました。

pulumi.interpolate`http://${server.hostname}:${loadBalancer.port}`
ログイン後にコピー

宛先:

pulumi.concat('http://', server.hostname, ':', loadBalancer.port)
ログイン後にコピー

出力

出力は、設定される可能性がある、または将来解決されて設定されるリソースからの値です。出力はその出力元のリソースに関連付けられているため、入力として pulumi.interpolate または pulumi.concat に渡すときにエッジを作成し、後で別のリソースの作成に使用できます。ノード (リソース) とそのエッジ (出力 -> 入力) によって作成されるリソース間の依存関係グラフにより、Pulumi は正しい順序でリソースを作成でき、グラフ内の次のリソースで必要なときに出力が確実に設定されるようになります。

入力

入力は、生の値、Promise、または出力にすることができます。リソースへの入力が出力である場合、出力が最初に作成されたリソースへの参照があります。入力が出力になる可能性があるという事実により、その依存関係を追跡できます。

その型定義は次のとおりです:

type Input<T> = T | Promise<T> | OutputInstance<T>;
ログイン後にコピー

30 秒でわかるタグ付きテンプレート リテラル

テンプレート リテラルのリテ​​ラル文字列部分を変更せずに、値 (${} の間の「プレースホルダー」) のみを大文字にする方法の例を次に示します。

function uppercaseValues(strings, ...values) {
  const result = [];
  strings.forEach((string, i) => {
    result.push(string);
    if (i < values.length) {
      result.push(values[i].toString().toUpperCase());
    }
  });
  return result.join('');
}

const name = "Chris";
const hobby = "TypeScript";

console.log(uppercaseValues`Hello, my name is ${name} and I love ${hobby}.`);
// Output: "Hello, my name is CHRIS and I love TYPESCRIPT."
ログイン後にコピー

pulumi.interpolate の実装

正確なソース コードを知らなくても、上記の例から拡張することで、自分で pulumi.interpolate を実装する方法を想像できます。次のようになります:

function interpolate(strings, ...values) {
  const result = [];
  strings.forEach((string, i) => {
    result.push(string);
    if (i < values.length) {
      result.push(values[i]);
    }
  });
  return pulumi.concat(...result);
}
ログイン後にコピー

私たちが行ったのは、最後の join 呼び出しを pulumi.concat への呼び出しに置き換えるだけです。これが実装である場合、実際の実装ではプレースホルダーのみを操作するのではなく、生の文字列を出力型からアンラップする必要があるかどうかのチェックを実行します。

TypeScript での関数定義は次のとおりです:

function interpolate(literals: TemplateStringsArray, ...placeholders: Input<any>[]): Output<string>;
ログイン後にコピー

これは concat に非常に似ています:

function concat(...params: Input<any>[]): Output<string>
ログイン後にコピー

実際には出力値に沿って転送し、親出力でラップしているだけであることに気づいたとき、電球の瞬間が来ます。

Python に戻る

interpolate を concat に移植するときに、いくつかの愚かな間違いを犯す可能性があります。例を使って説明しましょう。

TypeScript では、次のようにします:

function get_image_name(imageRegistry: Repository, name: string, version: Input<string>) {
    return pulumi.interpolate`${image_registry.repository_id}/${name}:${version}`
}
ログイン後にコピー

Python に移植すると、次のようになります:

def get_image_tag(image_registry: Repository, name: str, version: Input[str]):
    return pulumi.Output.concat(
        image_registry.repository_id,
        f"/{name}:{version}"
    )
ログイン後にコピー

ただし、interpolate はすべてのプレースホルダーを個別に反復して依存関係を作成し、出力を解決していました。私たちの Python コードでは、バージョン引数との関係が微妙に失われています。出力を手動で分割し、pulumi.Output.concat.

への個別の引数として表示する必要があります。

修正されたコードは次のようになります:

def get_image_tag(image_registry: Repository, name: str, version: Input[str]):
    return pulumi.Output.concat(
        image_registry.repository_id,
        f"/{name}:",
        version
    )
ログイン後にコピー

これで、バージョンが依存関係グラフに正しく含まれるようになり、エラーがなくなりました!

結論

pulumi.interpolate を TypeScript から Python に変換するには、Pulumi での出力と入力がどのように機能するかをより深く理解する必要があります。 Python はタグ付きテンプレート リテラルをサポートしていませんが、pulumi.concat を効果的に使用すると、同様の機能を実現できます。依存関係を手動で管理し、すべての出力値が適切に処理されるようにすることで、Python の Pulumi コードが TypeScript と同じくらい堅牢かつ効率的であることを保証できます。

以上がPython の Pulumi: 補間の翻訳の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへ:すべてがどのように機能するか C/CからJavaScriptへ:すべてがどのように機能するか Apr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

See all articles