[英]In python, when loading a yaml file, is it possible to delay evaluation of a value until a specific *different* key is set?
我使用python
和ruamel.yaml
加載配置文件。 當需要密碼或令牌時,我目前允許從用戶的.netrc
文件評估的 [ .NETRC
][1] 條目。
這工作正常,但當某些功能在嘗試連接和失敗之前需要一段時間時,有時會令人沮喪。
但是,要評估 .netrc 標記,我需要主機條目(它應該是 URL,但是 .netrc 允許主機字段中的任何字符串),這是 yaml 文件中的同級鍵。
我的 yaml 文件的相關部分如下所示。
connect:
url: https://my.company/path/to/service
login: mylogin
token: !NETRC
我需要token
在url
出現之前不被評估,並且是一種訪問該值的方法。
我期待太多了嗎? 有沒有辦法用 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.