تحليل Yaml وافترض أن مسار معين هو دائما سلسلة
سؤال
أنا أستخدم محلل Yaml من http://pyyaml.org وأريد أن يفسر دائمًا بعض الحقول كسلسلة ، لكن لا يمكنني معرفة كيفية عمل Add_path_resolver ().
على سبيل المثال: يفترض المحللون أن "الإصدار" هو تعويم:
network:
- name: apple
- name: orange
version: 2.3
site: banana
تحتوي بعض الملفات على "الإصدار: 2" (والتي يتم تفسيرها على أنها int) أو "الإصدار: 2.3 ألفا" (والتي يتم تفسيرها على أنها STR).
أريدهم أن يفسروا دائمًا على أنهم str.
يبدو أن yaml.add_path_resolver () يجب أن يسمح لي بتحديد ، "عندما ترى الإصدار: ، تفسر دائمًا على أنه STR) ولكنه غير موثق جيدًا. أفضل تخميني هو:
yaml.add_path_resolver(u'!root', ['version'], kind=str)
لكن هذا لا يعمل.
اقتراحات حول كيفية جعل حقل الإصدار الخاص بي دائمًا ما يكون سلسلة؟
ملاحظة: فيما يلي بعض الأمثلة على سلاسل "الإصدار" المختلفة وكيف يتم تفسيرها:
(Pdb) import yaml
(Pdb) import pprint
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
'site': 'banana',
'version': 2}
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2.3\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
'site': 'banana',
'version': 2.2999999999999998}
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2.3 alpha\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
'site': 'banana',
'version': '2.3 alpha'}
المحلول
إلى حد بعيد الحل الأسهل لهذا لا يستخدم الأساسي .load()
(وهو أمر غير آمن على أي حال) ، ولكن استخدمه مع Loader=BaseLoader
, ، الذي يحمل كل عدادات كسلسلة:
import yaml
yaml_str = """\
network:
- name: apple
- name: orange
version: 2.3
old: 2
site: banana
"""
data = yaml.load(yaml_str, Loader=yaml.BaseLoader)
print(data)
يعطي:
{'network': [{'name': 'apple'}, {'name': 'orange'}], 'version': '2.3', 'old': '2', 'site': 'banana'}
نصائح أخرى
من المصدر الحالي:
# Note: `add_path_resolver` is experimental. The API could be changed.
يبدو أنه لم يكتمل (حتى الآن؟). بناء الجملة ذلك سيكون العمل (بقدر ما أستطيع أن أقول) هو:
yaml.add_path_resolver(u'tag:yaml.org,2002:str', ['version'], yaml.ScalarNode)
ومع ذلك ، لا.
يبدو أنه يتم التحقق من حلول النوع الضمنية أولاً ، وإذا كان أحدهم يتطابق ، فهو لا يتحقق أبدًا من حلول المعرفة من قبل المستخدم. نرى Resolver.py لمزيد من التفاصيل (ابحث عن الوظيفة resolve
).
أقترح تغيير الخاص بك version
الدخول إلى
version: !!str 2.3
هذا سيشجعه دائمًا على سلسلة.