」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Python 中的 Pulumi:翻譯內插

Python 中的 Pulumi:翻譯內插

發佈於2024-07-29
瀏覽:706

Pulumi in Python: Translating Interpolation

Pulumi 是用於管理基礎設施即程式碼的強大工具,其跨不同語言的靈活性使其成為開發人員的熱門選擇。雖然 Pulumi 的 TypeScript 語法提供了一種乾淨、方便的方式來處理輸出和輸入,但將這些功能轉換為 Python 可能具有挑戰性。本文探討了在 TypeScript 中使用 pulumi.interpolate 的細微差別以及如何在 Python 中實現類似的功能。

普魯米插值

在 Pulumi 的 TypeScript 語法中,有一種用於連接輸出的簡潔方法。它利用標記模板文字,這在 Python 中不可用。根據 Pulumi 參考文檔,插值與 concat 類似,但設計為用作標記模板表達式。例如:

// 'server' and 'loadBalancer' are both resources that expose [Output] properties.
let val: Output = pulumi.interpolate `http://${server.hostname}:${loadBalancer.port}`

與 concat 一樣,${} 之間的「佔位符」可以是任何輸入,即它們可以是 Promise、輸出或只是普通的 JavaScript 值。

我在 TypeScript 中完成了大部分 Pulumi 工作,每當我需要將輸入傳遞到新資源時,我經常使用 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 以正確的順序建立資源,並確保在圖中下一個資源需要時填充輸出。

輸入

輸入可以是原始值、承諾或輸出。如果資源的輸入是輸出,則您可以引用最初建立輸出的資源。輸入可以是輸出這一事實使其能夠追蹤其依賴關係。

這是它的型別定義:

type Input = T | Promise | OutputInstance;

30 秒內標記模板文字

下面是我們如何僅將值(${} 之間的「佔位符」)大寫的範例,而不更改範本文字的文字字串部分:

function uppercaseValues(strings, ...values) {
  const result = [];
  strings.forEach((string, i) => {
    result.push(string);
    if (i 



實作 pulumi.interpolate

在不知道確切的源代碼的情況下,從上面的例子擴展,我們可以想像如何自己實作 pulumi.interpolate 。它可能看起來像這樣:

function interpolate(strings, ...values) {
  const result = [];
  strings.forEach((string, i) => {
    result.push(string);
    if (i 



我們所做的就是將最終的 join 呼叫替換為對 pulumi.concat 的呼叫。如果這是實現,我們將檢查是否需要從輸出類型中解開原始字串,而不是僅對佔位符進行操作,這才是真正的實現所做的。

其在TypeScript中的函數定義為:

function interpolate(literals: TemplateStringsArray, ...placeholders: Input[]): Output;

與 concat 非常相似:

function concat(...params: Input[]): Output

當您意識到您實際上只是沿著輸出值轉發並將它們包裝在父輸出中時,靈光一現。

回到Python

將 interpolate 移植到 concat 時,您可能會犯一些愚蠢的錯誤。我們用一個例子來示範一下。

在 TypeScript 中,我會這麼做:

function get_image_name(imageRegistry: Repository, name: string, version: Input) {
    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}"
    )

但是,插值會單獨迭代每個佔位符以建立依賴項並解析輸出。在我們的 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 中的一樣健全和高效。

版本聲明 本文轉載於:https://dev.to/cdierkens/pulumi-in-python-translating-interpolation-8nh?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • JavaScript 機器學習入門:TensorFlow.js 初學者指南
    JavaScript 機器學習入門:TensorFlow.js 初學者指南
    機器學習 (ML) 迅速改變了軟體開發世界。直到最近,由於 TensorFlow 和 PyTorch 等函式庫,Python 仍是 ML 領域的主導語言。但隨著 TensorFlow.js 的興起,JavaScript 開發人員現在可以深入令人興奮的機器學習世界,使用熟悉的語法直接在瀏覽器或 Nod...
    程式設計 發佈於2024-11-05
  • extjs API 查詢參數範例
    extjs API 查詢參數範例
    API 查詢 參數是附加到 API 請求 URL 的鍵值對,用於傳送附加資訊至伺服器。它們允許用戶端(例如 Web 瀏覽器或應用程式)在向伺服器發出請求時指定某些條件或傳遞資料。 查詢參數加入到 URL 末端問號 (?) 後。每個參數都是鍵值對,鍵和值之間以等號 (=) 分隔。如果有多個查詢參數,...
    程式設計 發佈於2024-11-05
  • 如何解決Go中從不同套件匯入Proto檔案時出現「Missing Method Protoreflect」錯誤?
    如何解決Go中從不同套件匯入Proto檔案時出現「Missing Method Protoreflect」錯誤?
    如何從不同的套件導入Proto 檔案而不遇到「Missing Method Protoreflect」錯誤在Go 中,protobuf 常用於資料序列化。將 protobuf 組織到不同的套件中時,可能會遇到與缺少 ProtoReflect 方法相關的錯誤。當嘗試將資料解組到單獨套件中定義的自訂 p...
    程式設計 發佈於2024-11-05
  • 為什麼MySQL在查詢「Field = 0」非數位資料時傳回所有行?
    為什麼MySQL在查詢「Field = 0」非數位資料時傳回所有行?
    不明確的查詢:理解為什麼MySQL 回傳「Field=0」的所有行在MySQL 查詢領域,一個看似無害的比較,例如“SELECT * FROM table WHERE email=0”,可能會產生意外的結果。它沒有按預期過濾特定行,而是返回表中的所有記錄,從而引發了對資料安全性和查詢完整性的擔憂。 ...
    程式設計 發佈於2024-11-05
  • 伺服器發送事件 (SSE) 的工作原理
    伺服器發送事件 (SSE) 的工作原理
    SSE(服务器发送事件)在 Web 开发领域并未广泛使用,本文将深入探讨 SSE 是什么、它是如何工作的以及它如何受益您的申请。 什么是上交所? SSE 是一种通过 HTTP 连接从服务器向客户端发送实时更新的简单而有效的方法。它是 HTML5 规范的一部分,并受到所有现代 Web ...
    程式設計 發佈於2024-11-05
  • 如何從字串 TraceID 建立 OpenTelemetry Span?
    如何從字串 TraceID 建立 OpenTelemetry Span?
    從字串 TraceID 建構 OpenTelemetry Span要建立 Span 之間的父子關係,必須在上下文傳播不可行的情況下使用標頭。在這種情況下,追蹤 ID 和跨度 ID 包含在訊息代理程式的標頭中,這允許訂閱者使用父追蹤 ID 建立新的跨度。 解決方案以下步驟可以使用追蹤ID 在訂閱者端建...
    程式設計 發佈於2024-11-05
  • 如何在gRPC中實現伺服器到客戶端的廣播?
    如何在gRPC中實現伺服器到客戶端的廣播?
    gRPC 中的廣播:伺服器到客戶端通訊建立gRPC 連線時,通常需要將事件或更新從伺服器廣播到客戶端連接的客戶端。為了實現這一點,可以採用各種方法。 Stream Observables常見的方法是利用伺服器端流。每個連線的客戶端都與伺服器建立自己的流。然而,直接訂閱其他伺服器客戶端流是不可行的。 ...
    程式設計 發佈於2024-11-05
  • 為什麼填入在 Safari 和 IE 選擇清單中不起作用?
    為什麼填入在 Safari 和 IE 選擇清單中不起作用?
    在Safari 和IE 的選擇清單中不顯示填充儘管W3 規範中沒有限制,但WebKit 瀏覽器不支援選擇框中的填充,包括Safari和Chrome。因此,這些瀏覽器中不應用填充。 要解決此問題,請考慮使用 text-indent 而不是 padding-left。透過相應增加選擇框的寬度來保持相同的...
    程式設計 發佈於2024-11-05
  • 在 Spring Boot 中建立自訂註解的終極指南
    在 Spring Boot 中建立自訂註解的終極指南
    Such annotations fill the entire project in Spring Boot. But do you know what problems these annotations solve? Why were custom annotations introduce...
    程式設計 發佈於2024-11-05
  • 為什麼 Elixir 在非同步處理方面比 Node.js 更好?
    為什麼 Elixir 在非同步處理方面比 Node.js 更好?
    简单回答:Node.js 是单线程的,并拆分该单线程来模拟并发,而 Elixir 利用了 Erlang 虚拟机 BEAM 原生的并发和并行性,同时执行进程。 下面,我们将更深入地了解这种差异,探索两个关键概念:Node.js 事件循环和 Elixir 的 BEAM VM 和 OTP。这些元素对于理解...
    程式設計 發佈於2024-11-05
  • AngularJS $watch 如何取代動態導航高度調整中的計時器?
    AngularJS $watch 如何取代動態導航高度調整中的計時器?
    避免 AngularJS 的高度監視計時器當導航高度是動態時,AngularJS 程式設計師經常面臨響應式導航的挑戰。這就導致需要調整內容的 margin-top 值以回應導航高度的變化。 以前,使用計時器來偵測導航高度的變化,但這種方法有缺點:使用計時器和調整內容的 margin-top 出現延遲...
    程式設計 發佈於2024-11-05
  • 從零到 Web 開發人員:掌握 PHP 基礎知識
    從零到 Web 開發人員:掌握 PHP 基礎知識
    掌握PHP基礎至關重要:安裝PHP建立PHP檔案運行程式碼理解變數和資料類型使用表達式和運算子建立實際專案以提高技能 PHP開發入門:掌握PHP基礎PHP是一種用途廣泛、功能強大的腳本語言,用於創建動態且互動式Web應用程式。對於初學者來說,掌握PHP的基本知識至關重要。 一、安裝PHP在本地開發機...
    程式設計 發佈於2024-11-05
  • 緩衝區:Node.js
    緩衝區:Node.js
    Node.js 中緩衝區的簡單指南 Node.js 中的 Buffer 用於處理原始二進位數據,這在處理流、文件或網路數據時非常有用。 如何建立緩衝區 來自字串: const buf = Buffer.from('Hello'); 分配特定大小的Buffer...
    程式設計 發佈於2024-11-05
  • 掌握 Node.js 中的版本管理
    掌握 Node.js 中的版本管理
    作為開發者,我們經常遇到需要不同 Node.js 版本的專案。對於可能不經常參與 Node.js 專案的新手和經驗豐富的開發人員來說,這種情況都是一個陷阱:確保每個專案使用正確的 Node.js 版本。 在安裝依賴項並執行專案之前,驗證您的 Node.js 版本是否符合或至少相容專案的要求至關重要...
    程式設計 發佈於2024-11-05
  • 如何在 Go 二進位檔案中嵌入 Git 修訂資訊以進行故障排除?
    如何在 Go 二進位檔案中嵌入 Git 修訂資訊以進行故障排除?
    確定Go 二進位檔案中的Git 修訂版部署程式碼時,將二進位檔案與建置它們的git 修訂版關聯起來會很有幫助排除故障的目的。然而,直接使用修訂號更新原始程式碼是不可行的,因為它會改變原始程式碼。 解決方案:利用建造標誌解決此挑戰的方法包括利用建造標誌。透過使用建置標誌在主套件中設定當前 git 修訂...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3