تحليل Yaml وافترض أن مسار معين هو دائما سلسلة

StackOverflow https://stackoverflow.com/questions/3875579

  •  28-09-2019
  •  | 
  •  

سؤال

أنا أستخدم محلل 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

هذا سيشجعه دائمًا على سلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top