2012-12-22 35 views
6

Tôi đang sử dụng YAML cho máy tính và định dạng đầu vào có thể chỉnh sửa và có thể đọc được cho trình giả lập. Đối với khả năng đọc của con người, một số phần của đầu vào chủ yếu là tuân theo phong cách chặn, trong khi phong cách dòng chảy phù hợp với những người khác tốt hơn.Chỉ định kiểu cho các phần của vùng đổ PyYAML

Giá trị mặc định cho PyYAML là sử dụng kiểu khối bất cứ nơi nào có bản đồ hoặc chuỗi lồng nhau và kiểu luồng ở mọi nơi khác. * default_flow_style * cho phép người dùng chọn tất cả kiểu luồng hoặc tất cả kiểu khối.

Nhưng tôi muốn tập tin đầu ra nhiều hình thức

bonds: 
- { strength: 2.0 } 
- ... 
tiles: 
- { color: red, edges: [1, 0, 0, 1], stoic: 0.1} 
- ... 
args: 
    block: 2 
    Gse: 9.4 

Như có thể thấy, điều này không làm theo một mô hình phù hợp cho phong cách xuyên suốt, và thay vào đó thay đổi tùy thuộc vào một phần của tập tin . Về cơ bản, tôi muốn có thể chỉ định rằng tất cả các giá trị trong một số chuỗi kiểu khối được trong phong cách dòng chảy. Có cách nào để có được loại kiểm soát mức độ tốt đó đối với việc bán phá giá không? Có thể đổ bản đồ cấp cao nhất theo một thứ tự cụ thể trong khi không yêu cầu thứ tự đó (ví dụ, omap) sẽ tốt đẹp để dễ đọc.

Trả lời

11

Nó chỉ ra điều này có thể được thực hiện bằng cách xác định lớp con với người đại diện cho mỗi mục Tôi không muốn theo mặc định_flow_style, và sau đó chuyển đổi mọi thứ cần thiết cho những người trước khi bán phá giá. Trong trường hợp này, có nghĩa là tôi nhận được một cái gì đó như:

class blockseq(dict): pass 
def blockseq_rep(dumper, data): 
    return dumper.represent_mapping(u'tag:yaml.org,2002:map', data, flow_style=False) 

class flowmap(dict): pass 
def flowmap_rep(dumper, data): 
    return dumper.represent_mapping(u'tag:yaml.org,2002:map', data, flow_style=True) 

yaml.add_representer(blockseq, blockseq_rep) 
yaml.add_representer(flowmap, flowmap_rep) 

def dump(st): 
    st['tiles'] = [ flowmap(x) for x in st['tiles'] ] 
    st['bonds'] = [ flowmap(x) for x in st['bonds'] ] 
    if 'xgrowargs' in st.keys(): st['xgrowargs'] = blockseq(st['xgrowargs']) 
    return yaml.dump(st) 

Annoyingly, các dumper.represent_list sử dụng dễ dàng hơn và dumper.represent_dict không cho phép flow_style được xác định, vì vậy tôi phải chỉ định thẻ, nhưng hệ thống không hoạt động.

+0

Nhận xét của bạn vẫn cập nhật về 'dumper.represent_sequence' và' dumper.represent_dict' không có tùy chọn flow_style? xem http://pyyaml.org/wiki/PyYAMLDocumentation#Dumper – Hotschke

+0

Thực ra tôi cố gắng áp dụng 'flowmap' của bạn trên một chuỗi:' - edge: \ n - [1,2] \ n - [2, 1, [1 , 0]] '. Tôi muốn có mọi cạnh trên một dòng riêng biệt (được biểu thị bằng '\ n'). Hiện tại, nó trông giống như sau: '- cạnh: \ n - [1,2] \ n - 1 \ n - 2 \ n - [1, 0]' – Hotschke

+0

Vâng, nhận xét của tôi vẫn hợp lệ; 'represent_mapping' có nó, nhưng hai cái kia thì không; chúng có lẽ chỉ là trình bao bọc cho 'represent_mapping'. Đối với những gì bạn đang làm, flowmap không phải là những gì bạn muốn. Bạn một chuỗi (theo các cạnh :) mà bạn muốn có flow_style = True, không phải là ánh xạ. – cge

Các vấn đề liên quan