簡體   English   中英

在 python 中,加載 yaml 文件時,是否可以延遲對值的評估,直到設置了特定的 *不同* 鍵?

[英]In python, when loading a yaml file, is it possible to delay evaluation of a value until a specific *different* key is set?

我使用pythonruamel.yaml加載配置文件。 當需要密碼或令牌時,我目前允許從用戶的.netrc文件評估的 [ .NETRC ][1] 條目。

這工作正常,但當某些功能在嘗試連接和失敗之前需要一段時間時,有時會令人沮喪。

但是,要評估 .netrc 標記,我需要主機條目(它應該是 URL,但是 .netrc 允許主機字段中的任何字符串),這是 yaml 文件中的同級鍵。

我的 yaml 文件的相關部分如下所示。

connect:
  url: https://my.company/path/to/service
  login: mylogin
  token: !NETRC

我需要tokenurl出現之前被評估,並且是一種訪問該值的方法。

我期待太多了嗎? 有沒有辦法用 ruamel.yaml 做到這一點?

代碼的簡化示例如下所示:

import ruamel.yaml
yaml = ruamel.yaml.YAML(typ='safe')
yaml.default_flow_style = False

class NetrcTag(str):
    yaml_tag = '!NETRC'
    def __new__(cls, value):
        newvalue = str.__new__(cls, '!NETRC')
        # newvalue.netrctag = load_netrc(cfg, url value goes here) <----
        newvalue.netrctag = value
        return newvalue

    @classmethod
    def from_yaml(cls, constructor, node):
        return cls(node.value)

    @classmethod
    def to_yaml(cls, represented, node):
        return representer.represent_scalar(cls.yaml_tag, node.netrctag)

[1]:謝謝@Anthon! 我用 .ENV SOME_VAR 加載了一個 yaml 文件並用值替換了字符串? 如何保存原始字符串而不是更改后的字符串?

實例化NetrcTag時, url 值不一定為ruamel.yaml 它應該在你的例子中,但你不應該依賴它,並且需要深入研究 ruamel.yaml 內部結構。

相反,我建議使用傳入 url 並檢索實際值的方法set_url來擴展NetrcTag class。 Tricky 可能是在未從__new__()完成時更新str的實際語法。

這無助於使用 URL 可能導致的延遲獲取數據。 在加載之后才能調用set_url ,但是如果直到稍后在程序中才使用該值,您可以使用多處理或異步調用來進行檢索,並且它可能會在您需要該值之前完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM