2014-06-25 27 views
5

Tôi có một dự án python nơi tôi muốn sử dụng YAML (pyYaml 3.11), đặc biệt vì nó "đẹp" và dễ dàng cho người dùng chỉnh sửa trong trình soạn thảo văn bản nếu cần thiết. Vấn đề của tôi là, nếu tôi mang YAML vào một ứng dụng python (như tôi sẽ cần) và chỉnh sửa nội dung (như tôi sẽ cần) thì việc viết tài liệu mới thường không đẹp như những gì tôi bắt đầu.sản lượng khá với pyyaml ​​

Tài liệu pyyaml ​​khá kém - thậm chí không ghi tài liệu tham số vào hàm kết xuất. Tôi đã tìm thấy http://dpinte.wordpress.com/2008/10/31/pyaml-dump-option/. Tuy nhiên, tôi vẫn thiếu thông tin tôi cần. (Tôi bắt đầu nhìn vào nguồn gốc, nhưng nó dường như không hấp dẫn nhất. Nếu tôi không có giải pháp ở đây, thì đó là sự truy đòi duy nhất của tôi.)

Tôi bắt đầu với một tài liệu như sau:

 
- color green : 
    inputs : 
     - port thing : 
      widget-hint : filename 
      widget-help : Select a filename 
     - port target_path : 
      widget-hint : path 
      value : 'thing' 
    outputs: 
     - port value: 
      widget-hint : string 
    text : | 
      I'm lost and I'm found 
      and I'm hungry like the wolf. 

Sau khi tải vào python (yaml.safe_load (s)), tôi thử một vài cách bán phá giá nó ra:

 
>>> print yaml.dump(d3, default_flow_style=False, default_style='') 
- color green: 
    inputs: 
    - port thing: 
     widget-help: Select a filename 
     widget-hint: filename 
    - port target_path: 
     value: thing 
     widget-hint: path 
    outputs: 
    - port value: 
     widget-hint: string 
    text: 'I''m lost and I''m found 

     and I''m hungry like the wolf. 

     '
 
>>> print yaml.dump(d3, default_flow_style=False, default_style='|') 
- "color green": 
    "inputs": 
    - "port thing": 
     "widget-help": |- 
      Select a filename 
     "widget-hint": |- 
      filename 
    - "port target_path": 
     "value": |- 
      thing 
     "widget-hint": |- 
      path 
    "outputs": 
    - "port value": 
     "widget-hint": |- 
      string 
    "text": | 
     I'm lost and I'm found 
     and I'm hungry like the wolf. 

Lý tưởng nhất, tôi muốn "chuỗi ngắn" để không sử dụng dấu ngoặc kép, như trong kết quả đầu tiên. Nhưng tôi muốn các chuỗi nhiều dòng được viết dưới dạng các khối, như với kết quả thứ hai. Tôi đoán về cơ bản, tôi đang cố gắng giảm thiểu một sự bùng nổ các trích dẫn không cần thiết trong tập tin mà tôi cảm nhận được sẽ làm cho việc chỉnh sửa trong trình soạn thảo văn bản trở nên khó chịu hơn nhiều.

Có ai có kinh nghiệm với điều này không?

Trả lời

5

Nếu bạn có thể sử dụng ruamel.yaml (từ chối trách nhiệm: Tôi là tác giả của phiên bản này nâng cao của PyYAML), bạn có thể làm:

import ruamel.yaml 

yaml_str = """\ 
- color green : 
    inputs : 
     - port thing : 
      widget-hint : filename 
      widget-help : Select a filename 
     - port target_path : 
      widget-hint : path 
      value : 'thing' 
    outputs: 
     - port value: 
      widget-hint : string 
    text : | 
      I'm lost and I'm found 
      and I'm hungry like the wolf. 
""" 

data = ruamel.yaml.round_trip_load(yaml_str) 
res = "" 
for line in ruamel.yaml.round_trip_dump(data, indent=5, block_seq_indent=3).splitlines(True): 
    res += line[3:] 
print(res) 

bạn nhận được:

- color green: 
     inputs: 
      - port thing: 
       widget-hint: filename 
       widget-help: Select a filename 
      - port target_path: 
       widget-hint: path 
       value: thing 
     outputs: 
      - port value: 
       widget-hint: string 
     text: | 
      I'm lost and I'm found 
      and I'm hungry like the wolf. 

Không chính xác những gì bạn đã bắt đầu với (nhưng sau khi khứ hồi này nó là ổn định). Với các phiên bản mới hơn của ruamel.yaml bạn có thể đặt cả thụt lề và thụt lề tương đối của một chuỗi - trong thụt lề đó. Tuy nhiên, sau này cũng ảnh hưởng đến trình tự cấp cao nhất của bạn, do đó xử lý bài đăng.

quan trọng (với tôi) những điều mà được bảo quản: ý kiến, neo, lập bản đồ sáp nhập, và vô hướng đen (multi-line sử dụng |)

+0

@AndySmith Ok. Cho phép xóa những nhận xét này, vì họ sẽ không giúp đỡ bất kỳ ai. – Anthon

+0

Có dễ dàng chỉ định trong ruamel.yaml rằng các chuỗi nhiều dòng nên được viết dưới dạng các khối (với '|') và chuỗi ngắn không được nhận báo giá, mà không có tệp yaml để gọi một chuyến đi khứ hồi không? – oulenz

+0

@oulenz Điều đó phụ thuộc vào sự dễ dàng của bạn, tất nhiên bạn phải có một số quy tắc (ví dụ: bất kỳ chuỗi nào có dòng mới phải là một khối vô hướng chữ; bất kỳ không có dấu cách nào đều không được bỏ phiếu) nếu bạn không muốn sử dụng bằng tay. Tại sao bạn không hỏi một câu hỏi ở đây về SO về điều đó, nếu bạn quan tâm đến việc đó được thực hiện? – Anthon

3

Thử máy in đẹp pyaml. Nó được gần gũi hơn, mặc dù nó đặt dấu ngoặc kép quanh chuỗi ngắn với khoảng trống trong đó:

>>> print pyaml.dump(d3) 
- 'color green': 
    inputs: 
     - 'port thing': 
      widget-help: 'Select a filename' 
      widget-hint: filename 
     - 'port target_path': 
      value: thing 
      widget-hint: path 
    outputs: 
     - 'port value': 
      widget-hint: string 
    text: | 
     I'm lost and I'm found 
     and I'm hungry like the wolf. 
Các vấn đề liên quan